In this notebook we conduct exploratory factor analyses (EFAs) on the datasets for our studies of concepts of mental life, in which each participants judged the various mental capacities of a particular target entity. We analyze datasets for adults and children from each of our five field sites: the US, Ghana, Thailand, China, and Vanuatu.
This notebook contains the results presented in the main text, in which we use Pearson correlations with our three-point response scale (no = 0, kinda = 0.5, yes = 1); see supplemental analyses for a version of these analyses treating kinda = yes = 1 and using tetrachoric correlations.
Adults
Samples
country n
US 127
Ghana 150
Thailand 150
China 136
Vanuatu 148
Total 711
Factor retention: parallel analysis

Exploratory factor analysis
The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.Matrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneMatrix was not positive definite, smoothing was doneThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyconvergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefully
Factor loadings
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used


Congruence
funs() is soft deprecated as of dplyr 0.8.0
Please use a list of either functions or lambdas:
# Simple named list:
list(mean = mean, median = median)
# Auto named with `tibble::lst()`:
tibble::lst(mean, median)
# Using lambdas
list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
This warning is displayed once per session.

Children
Samples
country n
US 117
Ghana 150
Thailand 152
China 131
Vanuatu 143
Total 693
Factor retention: parallel analysis

Exploratory factor analysis
The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyconvergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyconvergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyconvergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.An ultra-Heywood case was detected. Examine the results carefullyThe estimated weights for the factor scores are probably incorrect. Try a different factor score estimation method.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.
Factor loadings
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used


Bootstrapped congruence

All samples
Congruence
the condition has length > 1 and only the first element will be usedVectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.the condition has length > 1 and only the first element will be usedVectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used

Jaccard Similarity
the condition has length > 1 and only the first element will be usedVectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.the condition has length > 1 and only the first element will be usedVectorized input to `element_text()` is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used

Developmental comparisons
Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector

Column `country` joining character vector and factor, coercing into character vector


Other metrics of similarity
[1] 0.6086957


Interfactor correlations



US ADULTS
F1 F2 F3
F1 1.0000000 0.5114648 0.4805622
F2 0.5114648 1.0000000 0.5376676
F3 0.4805622 0.5376676 1.0000000
F1 F2 F3
F1 1.0000000 0.2615963 0.2309400
F2 0.2615963 1.0000000 0.2890864
F3 0.2309400 0.2890864 1.0000000
US CHILDREN
F1 F2 F3
F1 1.0000000 0.3031865 0.4334098
F2 0.3031865 1.0000000 0.4856172
F3 0.4334098 0.4856172 1.0000000
F1 F2 F3
F1 1.00000000 0.09192203 0.1878441
F2 0.09192203 1.00000000 0.2358240
F3 0.18784410 0.23582402 1.0000000
GHANA ADULTS
F1 F2 F3
F1 1.0000000 0.2725881 0.3444798
F2 0.2725881 1.0000000 0.2558207
F3 0.3444798 0.2558207 1.0000000
F1 F2 F3
F1 1.00000000 0.07430429 0.11866634
F2 0.07430429 1.00000000 0.06544426
F3 0.11866634 0.06544426 1.00000000
GHANA CHILDREN
F1 F2 F3
F1 1.0000000 0.5790820 0.1747165
F2 0.5790820 1.0000000 0.3854114
F3 0.1747165 0.3854114 1.0000000
F1 F2 F3
F1 1.00000000 0.335336 0.03052585
F2 0.33533601 1.000000 0.14854196
F3 0.03052585 0.148542 1.00000000
THAILAND ADULTS
F1 F2 F3
F1 1.0000000 0.4142881 0.3218404
F2 0.4142881 1.0000000 0.4161488
F3 0.3218404 0.4161488 1.0000000
F1 F2 F3
F1 1.0000000 0.1716346 0.1035813
F2 0.1716346 1.0000000 0.1731798
F3 0.1035813 0.1731798 1.0000000
THAILAND CHILDREN
F1 F2 F3 F4
F1 1.000000000 0.54189979 0.1468730 -0.008909088
F2 0.541899792 1.00000000 0.3169020 0.092978779
F3 0.146873030 0.31690205 1.0000000 0.269117295
F4 -0.008909088 0.09297878 0.2691173 1.000000000
F1 F2 F3 F4
F1 1.000000e+00 0.293655384 0.02157169 7.937185e-05
F2 2.936554e-01 1.000000000 0.10042691 8.645053e-03
F3 2.157169e-02 0.100426907 1.00000000 7.242412e-02
F4 7.937185e-05 0.008645053 0.07242412 1.000000e+00
CHINA ADULTS
F1 F2 F3
F1 1.0000000 0.4590388 0.6187141
F2 0.4590388 1.0000000 0.3703614
F3 0.6187141 0.3703614 1.0000000
F1 F2 F3
F1 1.0000000 0.2107166 0.3828072
F2 0.2107166 1.0000000 0.1371675
F3 0.3828072 0.1371675 1.0000000
CHINA CHILDREN
F1 F2 F3 F4
F1 1.0000000 0.51249526 0.3245885 0.25786749
F2 0.5124953 1.00000000 0.1524842 0.07635739
F3 0.3245885 0.15248416 1.0000000 0.13450834
F4 0.2578675 0.07635739 0.1345083 1.00000000
F1 F2 F3 F4
F1 1.00000000 0.262651390 0.10535767 0.066495642
F2 0.26265139 1.000000000 0.02325142 0.005830451
F3 0.10535767 0.023251420 1.00000000 0.018092495
F4 0.06649564 0.005830451 0.01809249 1.000000000
VANUATU ADULTS
F1 F2
F1 1.000000 0.687325
F2 0.687325 1.000000
F1 F2
F1 1.0000000 0.4724157
F2 0.4724157 1.0000000
VANUATU CHILDREN
F1 F2 F3
F1 1.0000000 0.3116574 0.5189923
F2 0.3116574 1.0000000 0.3362370
F3 0.5189923 0.3362370 1.0000000
F1 F2 F3
F1 1.00000000 0.09713036 0.2693530
F2 0.09713036 1.00000000 0.1130554
F3 0.26935296 0.11305535 1.0000000
LS0tCnRpdGxlOiAiQ29uY2VwdHMgb2YgbWVudGFsIGxpZmUgYWNyb3NzIGN1bHR1cmVzOiBQcmltYXJ5IGFuYWx5c2lzIgphdXRob3JzOiAiV2Vpc21hbiwgTGVnYXJlLCAmIEx1aHJtYW5uIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCmBgYHtyIHNldHVwfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEYsIG1lc3NhZ2UgPSBGKQpgYGAKCkluIHRoaXMgbm90ZWJvb2sgd2UgY29uZHVjdCBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzZXMgKEVGQXMpIG9uIHRoZSBkYXRhc2V0cyBmb3Igb3VyIHN0dWRpZXMgb2YgY29uY2VwdHMgb2YgbWVudGFsIGxpZmUsIGluIHdoaWNoIGVhY2ggcGFydGljaXBhbnRzIGp1ZGdlZCB0aGUgdmFyaW91cyBtZW50YWwgY2FwYWNpdGllcyBvZiBhIHBhcnRpY3VsYXIgdGFyZ2V0IGVudGl0eS4gV2UgYW5hbHl6ZSBkYXRhc2V0cyBmb3IgYWR1bHRzIGFuZCBjaGlsZHJlbiBmcm9tIGVhY2ggb2Ygb3VyIGZpdmUgZmllbGQgc2l0ZXM6IHRoZSBVUywgR2hhbmEsIFRoYWlsYW5kLCBDaGluYSwgYW5kIFZhbnVhdHUuIAoKVGhpcyBub3RlYm9vayBjb250YWlucyB0aGUgcmVzdWx0cyBwcmVzZW50ZWQgaW4gdGhlIG1haW4gdGV4dCwgaW4gd2hpY2ggd2UgdXNlIFBlYXJzb24gY29ycmVsYXRpb25zIHdpdGggb3VyIHRocmVlLXBvaW50IHJlc3BvbnNlIHNjYWxlIChubyA9IDAsIGtpbmRhID0gMC41LCB5ZXMgPSAxKTsgc2VlIHN1cHBsZW1lbnRhbCBhbmFseXNlcyBmb3IgYSB2ZXJzaW9uIG9mIHRoZXNlIGFuYWx5c2VzIHRyZWF0aW5nIGtpbmRhID0geWVzID0gMSBhbmQgdXNpbmcgdGV0cmFjaG9yaWMgY29ycmVsYXRpb25zLgoKCmBgYHtyLCBlY2hvID0gRiwgbWVzc2FnZSA9IEZ9CnNvdXJjZSgiLi9zY3JpcHRzL2RlcGVuZGVuY2llcy5SIikKc291cmNlKCIuL3NjcmlwdHMvY3VzdG9tX2Z1bnMuUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3Zhcl9yZWNvZGVfY29udHJhc3QuUiIpCmBgYAoKYGBge3IgZGF0YX0KIyByZWFkIGluIGRhdGEsIHNob3J0ZW4gImZlZWwgc2ljaywiIGFuZCBsaW1pdCB0byB1bml2ZXJzYWwgdGFyZ2V0cyBhbmQgcXVlc3Rpb25zOiBhZHVsdHMKZF91c19hZHVsdHMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF91c19hZHVsdHMuY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfZ2hfYWR1bHRzIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfZ2hfYWR1bHRzLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQpkX3RoX2FkdWx0cyA8LSByZWFkX2NzdigiLi4vZGF0YS9kX3RoX2FkdWx0cy5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKZF9jaF9hZHVsdHMgPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF9jaF9hZHVsdHMuY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfdnRfYWR1bHRzIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfdnRfYWR1bHRzLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQoKIyByZWFkIGluIGRhdGEsIHNob3J0ZW4gImZlZWwgc2ljaywiIGFuZCBsaW1pdCB0byB1bml2ZXJzYWwgdGFyZ2V0cyBhbmQgcXVlc3Rpb25zOiBjaGlsZHJlbgpkX3VzX2NoaWxkcmVuIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfdXNfY2hpbGRyZW4uY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfZ2hfY2hpbGRyZW4gPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF9naF9jaGlsZHJlbi5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKIyBkX2doX2VuZ19jaGlsZHJlbiA8LSByZWFkX2NzdigiLi4vZGF0YS9kX2doX2VuZ19jaGlsZHJlbi5jc3YiKSAlPiUKIyAgIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiMgICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpCmRfdGhfY2hpbGRyZW4gPC0gcmVhZF9jc3YoIi4uL2RhdGEvZF90aF9jaGlsZHJlbi5jc3YiKSAlPiUKICBmaWx0ZXIodGFyZ2V0ICVpbiUgbGV2ZWxzX3RhcmdldF91bml2LCBxdWVzdGlvbl9jYXQgPT0gInVuaXZlcnNhbCIpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIlxcLCAuKiQiLCAiIFxcWy4uLlxcXSIsIHF1ZXN0aW9uKSkKZF9jaF9jaGlsZHJlbiA8LSByZWFkX2NzdigiLi4vZGF0YS9kX2NoX2NoaWxkcmVuLmNzdiIpICU+JQogIGZpbHRlcih0YXJnZXQgJWluJSBsZXZlbHNfdGFyZ2V0X3VuaXYsIHF1ZXN0aW9uX2NhdCA9PSAidW5pdmVyc2FsIikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiXFwsIC4qJCIsICIgXFxbLi4uXFxdIiwgcXVlc3Rpb24pKQpkX3Z0X2NoaWxkcmVuIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2RfdnRfY2hpbGRyZW4uY3N2IikgJT4lCiAgZmlsdGVyKHRhcmdldCAlaW4lIGxldmVsc190YXJnZXRfdW5pdiwgcXVlc3Rpb25fY2F0ID09ICJ1bml2ZXJzYWwiKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJcXCwgLiokIiwgIiBcXFsuLi5cXF0iLCBxdWVzdGlvbikpICU+JQogICMgZmlsdGVyIG91dCBwYXJ0aWNpcGFudHMgb3V0c2lkZSBvZiB0aGUgYWdlIHJhbmdlCiAgZmlsdGVyKChhZ2UgPj0gNiAmIGFnZSA8PSAxMikgfCBpcy5uYShhZ2UpKQpgYGAKCmBgYHtyIHdpZGV9CiMgbWFrZSB3aWRlLWZvcm0gZGF0YXNldHMgZm9yIEVGQTogYWR1bHRzCmRfdXNfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF91c19hZHVsdHMpCmRfZ2hfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF9naF9hZHVsdHMpCmRfdGhfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF90aF9hZHVsdHMpCmRfY2hfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF9jaF9hZHVsdHMpCmRfdnRfYWR1bHRzX3cgPC0gd2lkZV9kZl9mdW4oZF92dF9hZHVsdHMpCgojIG1ha2Ugd2lkZS1mb3JtIGRhdGFzZXRzIGZvciBFRkE6IGNoaWxkcmVuCmRfdXNfY2hpbGRyZW5fdyA8LSB3aWRlX2RmX2Z1bihkX3VzX2NoaWxkcmVuKQpkX2doX2NoaWxkcmVuX3cgPC0gd2lkZV9kZl9mdW4oZF9naF9jaGlsZHJlbikKIyBkX2doX2VuZ19jaGlsZHJlbl93IDwtIHdpZGVfZGZfZnVuKGRfZ2hfZW5nX2NoaWxkcmVuKQpkX3RoX2NoaWxkcmVuX3cgPC0gd2lkZV9kZl9mdW4oZF90aF9jaGlsZHJlbikKZF9jaF9jaGlsZHJlbl93IDwtIHdpZGVfZGZfZnVuKGRfY2hfY2hpbGRyZW4pCmRfdnRfY2hpbGRyZW5fdyA8LSB3aWRlX2RmX2Z1bihkX3Z0X2NoaWxkcmVuKQpgYGAKCgojIEFkdWx0cwoKIyMgU2FtcGxlcwoKYGBge3Igc2FtcGxlcyBhZHVsdHN9CmJpbmRfcm93cyhkX3VzX2FkdWx0cywgZF9naF9hZHVsdHMsIGRfdGhfYWR1bHRzLCBkX2NoX2FkdWx0cywgZF92dF9hZHVsdHMpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZGlzdGluY3QoY291bnRyeSwgc3Vial9pZCkgJT4lCiAgY291bnQoY291bnRyeSkgJT4lCiAgamFuaXRvcjo6YWRvcm5fdG90YWxzKCkKYGBgCgojIyBTY2FsZSB1c2UKCmBgYHtyIHNjYWxlIHVzZSBtZWFuIG92ZXJhbGwgYWR1bHRzfQpiaW5kX3Jvd3MoZF91c19hZHVsdHMsIGRfZ2hfYWR1bHRzLCBkX3RoX2FkdWx0cywgZF9jaF9hZHVsdHMsIGRfdnRfYWR1bHRzKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSksCiAgICAgICAgIHJlc3BvbnNlX2NhdCA9IHJlY29kZV9mYWN0b3IocmVzcG9uc2VfY2F0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyIgPSAibm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJraW5kIG9mIiA9ICJraW5kIG9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVzIiA9ICJ5ZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9ICJtaXNzaW5nIGRhdGEiKSkgJT4lCiAgY291bnQoY291bnRyeSwgcmVzcG9uc2VfY2F0KSAlPiUKICBjb21wbGV0ZShyZXNwb25zZV9jYXQsIG5lc3RpbmcoY291bnRyeSksIGZpbGwgPSBsaXN0KG4gPSAwKSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKHByb3AgPSBuL3N1bShuLCBuYS5ybSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KC1uKSAlPiUKICBzcHJlYWQocmVzcG9uc2VfY2F0LCBwcm9wKSAlPiUKICBqYW5pdG9yOjphZG9ybl9wY3RfZm9ybWF0dGluZyhkaWdpdHMgPSAyKQpgYGAKCiMjIEZhY3RvciByZXRlbnRpb246IHBhcmFsbGVsIGFuYWx5c2lzCgpgYGB7ciBwYXJhbGxlbCBkaXN0IGFkdWx0cywgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNX0KIyBOT1RFOiB0aGVyZSBhcHBlYXJzIHRvIGJlIHNvbWUgdW5yZWxpYWJpbGl0eS9ub24tcmVwcm9kdWNpYmlsaXR5IGluIHJlc3VsdHMsIGVzcGVjaWFsbHkgZm9yIHZ0IGFkdWx0cywgd2hpY2ggSSBkb24ndCB1bmRlcnN0YW5kIC0tIHNvIGhlcmUncyB0aGUgZGlzdHJpYnV0aW9uIG92ZXIgb3V0Y29tZXMgb2YgcGFyYWxsZWwgYW5hbHlzaXMgd2l0aCAxMDAgaXRlcmF0aW9ucy4gV2UnbGwgY2hvb3NlIHRoZSBtZWRpYW4gbnVtYmVyIG9mIGZhY3RvcnMuCgppZiAoZmlsZS5leGlzdHMoIi4uL3Jlc3VsdHMvcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMuUkRTIikpIHsKICAKICBwYV9vdXRjb21lc19kaXN0X2FkdWx0cyA8LSByZWFkUkRTKCIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfYWR1bHRzLlJEUyIpCiAgCn0gZWxzZSB7CiAgCiAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMgPC0gZGF0YS5mcmFtZSh1cyA9IE5VTEwsIGdoID0gTlVMTCwgdGggPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBOVUxMLCB2dCA9IE5VTEwpCiAgCiAgc2V0LnNlZWQoNTQzMjEpCiAgbl9jb3JlcyA8LSBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKQogIG9wdGlvbnMobWMuY29yZXMgPSBuX2NvcmVzKQogIAogIGZvciAoaSBpbiAxOjEwMCkgewogICAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHNbaSwgInVzIl0gPC0gZmEucGFyYWxsZWwoZF91c19hZHVsdHNfdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2FkdWx0c1tpLCAiZ2giXSA8LSBmYS5wYXJhbGxlbChkX2doX2FkdWx0c193LCBwbG90ID0gRikkbmZhY3QgICAgIAogICAgcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHNbaSwgInRoIl0gPC0gZmEucGFyYWxsZWwoZF90aF9hZHVsdHNfdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2FkdWx0c1tpLCAiY2giXSA8LSBmYS5wYXJhbGxlbChkX2NoX2FkdWx0c193LCBwbG90ID0gRikkbmZhY3QKICAgIHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzW2ksICJ2dCJdIDwtIGZhLnBhcmFsbGVsKGRfdnRfYWR1bHRzX3csIHBsb3QgPSBGKSRuZmFjdAogIH0KICAKICBzYXZlUkRTKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzLCBmaWxlID0gIi4uL3Jlc3VsdHMvcGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMuUkRTIikKfQoKIyBwbG90CnBhX291dGNvbWVzX2Rpc3RfYWR1bHRzICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiaXRlciIpICU+JQogIGdhdGhlcihjb3VudHJ5LCBuZmFjdCwgLWl0ZXIpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2giLCAidGgiLCAiY2giLCAidnQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsZXZlbHNfY291bnRyeSkpICU+JQogIGdncGxvdChhZXMoeCA9IG5mYWN0KSkgKwogIGZhY2V0X2dyaWQofiBjb3VudHJ5KSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJjb3VudCIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxLCBtYXgocGFfb3V0Y29tZXNfZGlzdF9hZHVsdHMpICsgMSksCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgwLCAxMDAsIDEpKSArCiAgbGFicyh4ID0gIk51bWJlciBvZiBmYWN0b3JzIHN1Z2dlc3RlZCBieSBmYS5wYXJhbGxlbCgpIikKYGBgCgojIyBFeHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMKCmBgYHtyIGVmYSBhZHVsdHN9CnNldC5zZWVkKDU0MzIxKQoKIyBkbyBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXM6IGFkdWx0cwplZmFfdXNfYWR1bHRzIDwtIGZhX2Z1bihkX3VzX2FkdWx0c193LAogICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzJHVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV91c19hZHVsdHMkbG9hZGluZ3MpIDwtIHBhc3RlMCgidXNBRFVMVFNfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdXNfYWR1bHRzJGxvYWRpbmdzKSkKCmVmYV9naF9hZHVsdHMgPC0gZmFfZnVuKGRfZ2hfYWR1bHRzX3csIAogICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzJGdoKSwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV9naF9hZHVsdHMkbG9hZGluZ3MpIDwtIHBhc3RlMCgiZ2hBRFVMVFNfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfZ2hfYWR1bHRzJGxvYWRpbmdzKSkKCmVmYV90aF9hZHVsdHMgPC0gZmFfZnVuKGRfdGhfYWR1bHRzX3csIAogICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzJHRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV90aF9hZHVsdHMkbG9hZGluZ3MpIDwtIHBhc3RlMCgidGhBRFVMVFNfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdGhfYWR1bHRzJGxvYWRpbmdzKSkKCmVmYV9jaF9hZHVsdHMgPC0gZmFfZnVuKGRfY2hfYWR1bHRzX3csIAogICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzJGNoKSwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV9jaF9hZHVsdHMkbG9hZGluZ3MpIDwtIHBhc3RlMCgiY2hBRFVMVFNfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfY2hfYWR1bHRzJGxvYWRpbmdzKSkKCmVmYV92dF9hZHVsdHMgPC0gZmFfZnVuKGRfdnRfYWR1bHRzX3csIAogICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfYWR1bHRzJHZ0KSwKICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV92dF9hZHVsdHMkbG9hZGluZ3MpIDwtIHBhc3RlMCgidnRBRFVMVFNfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdnRfYWR1bHRzJGxvYWRpbmdzKSkKYGBgCgpgYGB7ciBmYWN0b3IgbmFtZXMgYWR1bHRzfQpmYWN0b3JfbmFtZXNfYWR1bHRzIDwtIGRhdGEuZnJhbWUoZmFjdG9yID0gYyhjb2xuYW1lcyhlZmFfdXNfYWR1bHRzJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX2doX2FkdWx0cyRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV90aF9hZHVsdHMkbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfY2hfYWR1bHRzJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3Z0X2FkdWx0cyRsb2FkaW5ncykpKSAlPiUKICBtdXRhdGUoYWdlX2dyb3VwID0gImFkdWx0cyIpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gY2FzZV93aGVuKGdyZXBsKCJedXMiLCBmYWN0b3IpIH4gIlVTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXmdoIiwgZmFjdG9yKSB+ICJHaGFuYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl50aCIsIGZhY3RvcikgfiAiVGhhaWxhbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJeY2giLCBmYWN0b3IpIH4gIkNoaW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXnZ0IiwgZmFjdG9yKSB+ICJWYW51YXR1IiksCiAgICAgICAgIGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBtdXRhdGUoZmFjdG9yX25hbWUgPSBnc3ViKCJedXMiLCAiVVMgIiwgZmFjdG9yKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJeZ2giLCAiR2guICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJedGgiLCAiVGguICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJeY2giLCAiQ2guICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJednQiLCAiVmEuICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJBRFVMVFMiLCAiYWR1bHRzIiwgZmFjdG9yX25hbWUpLAogICAgICAgICBmYWN0b3JfbmFtZSA9IGdzdWIoIl9GIiwgIiBGYWN0b3IgIiwgZmFjdG9yX25hbWUpKSAlPiUKICBtdXRhdGUoZmFjdG9yX2Rlc2NyaXB0ID0gcmVjb2RlKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzQURVTFRTX0YxID0gIkJvZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNBRFVMVFNfRjIgPSAiSGVhcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNBRFVMVFNfRjMgPSAiTWluZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaEFEVUxUU19GMSA9ICJJbm5lciBzcGhlcmUgKG1pbmQtbGlrZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2hBRFVMVFNfRjIgPSAiQm9keS1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdoQURVTFRTX0YzID0gIkludGVycGVyc29uYWwsIHJlbGlnaW91cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aEFEVUxUU19GMSA9ICJCb2R5LWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhBRFVMVFNfRjIgPSAiSGVhcnQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aEFEVUxUU19GMyA9ICJNaW5kLWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hBRFVMVFNfRjEgPSAiSGVhcnQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaEFEVUxUU19GMiA9ICJCb2R5LWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hBRFVMVFNfRjMgPSAiTWluZC1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0QURVTFRTX0YxID0gIkhhcm1vbnkgKG1pbmQtbGlrZSwgaGVhcnQtbGlrZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRBRFVMVFNfRjIgPSAiU2luIChib2R5LWxpa2UpIiksCiAgICAgICAgIGZhY3Rvcl9sYWJkZXNjcmlwdCA9IHBhc3RlKGdzdWIoIi4qX0YiLCAiRiIsIGZhY3RvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9kZXNjcmlwdCwgc2VwID0gIjogIikpCmBgYAoKIyMgRmFjdG9yIGxvYWRpbmdzCgpgYGB7ciBvcmRlciBhZHVsdHN9CiMgb3JkZXIgY2FwYWNpdGllczogYWR1bHRzCm9yZGVyX3VzX2FkdWx0cyA8LSBmYS5zb3J0KGVmYV91c19hZHVsdHMpJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfZ2hfYWR1bHRzIDwtIGZhLnNvcnQoZWZhX2doX2FkdWx0cykkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpvcmRlcl90aF9hZHVsdHMgPC0gZmEuc29ydChlZmFfdGhfYWR1bHRzKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX2NoX2FkdWx0cyA8LSBmYS5zb3J0KGVmYV9jaF9hZHVsdHMpJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkKb3JkZXJfdnRfYWR1bHRzIDwtIGZhLnNvcnQoZWZhX3Z0X2FkdWx0cykkbG9hZGluZ3NbXSAlPiUgcm93bmFtZXMoKQpgYGAKCmBgYHtyIGxvYWRpbmdzIGFkdWx0c30KIyBjb21waWxlIGxvYWRpbmdzOiBhZHVsdHMKbG9hZGluZ3NfYWR1bHRzIDwtIGJpbmRfcm93cygKICBsb2FkaW5nc19mdW4oZWZhX3VzX2FkdWx0cykgJT4lIG11dGF0ZShjb3VudHJ5ID0gIlVTIiksCiAgbG9hZGluZ3NfZnVuKGVmYV9naF9hZHVsdHMpICU+JSBtdXRhdGUoY291bnRyeSA9ICJHaGFuYSIpLAogIGxvYWRpbmdzX2Z1bihlZmFfdGhfYWR1bHRzKSAlPiUgbXV0YXRlKGNvdW50cnkgPSAiVGhhaWxhbmQiKSwKICBsb2FkaW5nc19mdW4oZWZhX2NoX2FkdWx0cykgJT4lIG11dGF0ZShjb3VudHJ5ID0gIkNoaW5hIiksCiAgbG9hZGluZ3NfZnVuKGVmYV92dF9hZHVsdHMpICU+JSBtdXRhdGUoY291bnRyeSA9ICJWYW51YXR1IikpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSwKICAgICAgICAgY2FwYWNpdHlfb3JkX3VzID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl91c19hZHVsdHMpLAogICAgICAgICBjYXBhY2l0eV9vcmRfZ2ggPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX2doX2FkdWx0cyksCiAgICAgICAgIGNhcGFjaXR5X29yZF90aCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfdGhfYWR1bHRzKSwKICAgICAgICAgY2FwYWNpdHlfb3JkX2NoID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl9jaF9hZHVsdHMpLAogICAgICAgICBjYXBhY2l0eV9vcmRfdnQgPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX3Z0X2FkdWx0cykpICU+JQogIGFycmFuZ2UoY291bnRyeSwgZmFjdG9yLCBkZXNjKGFicyhsb2FkaW5nKSksIGNhcGFjaXR5KSAlPiUKICBtdXRhdGUob3JkZXIgPSAxOm5yb3coLikpICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzKQpgYGAKCmBgYHtyIGhlYXRtYXBzIGJ5IHNpdGUgYWR1bHRzLCBmaWcud2lkdGggPSAxNSwgZmlnLmFzcCA9IDAuMjV9CnBsb3RfZ3JpZChoZWF0bWFwX2Z1bihlZmFfdXNfYWR1bHRzLCAKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJVUyIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIlVTOiBhZHVsdHMiKSwKICAgICAgICAgIGhlYXRtYXBfZnVuKGVmYV9naF9hZHVsdHMsCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiR2hhbmEiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGZhY3Rvcl9sYWJkZXNjcmlwdCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdCgpKSArIAogICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJHSEFOQTogYWR1bHRzIiksCiAgICAgICAgICBoZWF0bWFwX2Z1bihlZmFfdGhfYWR1bHRzLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNvdW50cnkgPT0gIlRoYWlsYW5kIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChmYWN0b3JfbGFiZGVzY3JpcHQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoKSkgKyAKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgICAgIGxhYnModGl0bGUgPSAiVEhBSUxBTkQ6IGFkdWx0cyIpLAogICAgICAgICAgaGVhdG1hcF9mdW4oZWZhX2NoX2FkdWx0cywKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJDaGluYSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIkNISU5BOiBhZHVsdHMiKSwKICAgICAgICAgIGhlYXRtYXBfZnVuKGVmYV92dF9hZHVsdHMsCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiVmFudWF0dSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIlZBTlVBVFU6IGFkdWx0cyIpLAogICAgICAgICAgbmNvbCA9IDUpCmBgYAoKYGBge3IgaGVhdG1hcCBhZHVsdHMsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjd9CiMgbWFrZSBoZWF0bWFwIGZpZ3VyZTogYWR1bHRzCmxvYWRpbmdzX2FkdWx0cyAlPiUKICBtdXRhdGUoZmFjdG9yX251bSA9IGFzLm51bWVyaWMoZ3N1YigiLipGIiwgIiIsIGZhY3RvcikpKSAlPiUKICBtdXRhdGUoc2FtcGxlID0gcGFzdGUoY291bnRyeSwgImFkdWx0cyIsIHNlcCA9ICJcbiIpKSAlPiUKICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cykgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGZhY3Rvcl9sYWJkZXNjcmlwdCwgZmFjdG9yX251bSksIAogICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3VzKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF9lYykpLCAKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX2doKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF90aCkpLAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfY2gpKSwKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3Z0KSksCiAgICAgICAgICAgICBmaWxsID0gbG9hZGluZykpICsKICBmYWNldF9ncmlkKH4gcmVvcmRlcihzYW1wbGUsIGFzLm51bWVyaWMoY291bnRyeSkpLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gMjAsIGJhcndpZHRoID0gMC41KSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoMC44LCAibGluZXMiKSwKICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSAiQ2FwYWNpdHkiLCBmaWxsID0gIkZhY3RvclxubG9hZGluZyIpCmBgYAoKIyMgQ29uZ3J1ZW5jZQoKYGBge3IgY29uZ3J1ZW5jZSBhZHVsdHN9CmNvbmdfYWR1bHRzIDwtIGZhLmNvbmdydWVuY2UoeCA9IGxpc3QoZWZhX3VzX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfZ2hfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV90aF9hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX2NoX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdnRfYWR1bHRzJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSA1KSAlPiUKICAjIGdldF91cHBlcl90cmlfZnVuKCkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiZmFjdG9yX0EiKSAlPiUKICBnYXRoZXIoZmFjdG9yX0IsIGNvbmcsIC1mYWN0b3JfQSkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lIAogICAgICAgICAgICAgIHJlbmFtZV9hbGwobGlzdCh+IChwYXN0ZSguLCAiQSIsIHNlcCA9ICJfIikpKSkpICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JSAKICAgICAgICAgICAgICByZW5hbWVfYWxsKGxpc3QofiAocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSkpKQpgYGAKCmBgYHtyIHRvcCBtYXRjaCBhZHVsdHN9CmNvbmdfYWR1bHRzX3RvcF9tYXRjaF9BIDwtIHRvcF9tYXRjaF9mdW4oY29uZ19hZHVsdHMsICJjb3VudHJ5X0EiKQpjb25nX2FkdWx0c190b3BfbWF0Y2hfQiA8LSB0b3BfbWF0Y2hfZnVuKGNvbmdfYWR1bHRzLCAiY291bnRyeV9CIikKYGBgCgpgYGB7ciBjb25nIGFsbCBwYWlycyBhZHVsdHMsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjd9CmNvbmdfYWR1bHRzICU+JQogIG11dGF0ZV9hdCgjdmFycyhjb250YWlucygibGFiZGVzY3JpcHQiKSksCiAgICB2YXJzKGZhY3Rvcl9sYWJkZXNjcmlwdF9BKSwKICAgIGZ1bnMoZ3N1YigiIFxcKCIsICJcblxcKCIsIC4pKSkgJT4lCiAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgIHZhcnMoZmFjdG9yX2xhYmRlc2NyaXB0X0EpLAogICAgZnVucyhnc3ViKCJcXC8iLCAiXFwvXG4iLCAuKSkpICU+JQogICMgbGVmdF9qb2luKGNvbmdfYWR1bHRzX3RvcF9tYXRjaF9BICU+JSByZW5hbWUodG9wX21hdGNoX0EgPSB0b3BfbWF0Y2gpKSAlPiUKICBsZWZ0X2pvaW4oY29uZ19hZHVsdHNfdG9wX21hdGNoX0IgJT4lIHJlbmFtZSh0b3BfbWF0Y2hfQiA9IHRvcF9tYXRjaCkpICU+JQogIG11dGF0ZShpc190b3BfbWF0Y2ggPSBjYXNlX3doZW4oZmFjdG9yX0EgPT0gZmFjdG9yX0IgfiAiYm9sZC5pdGFsaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmYWN0b3JfQSA9PSB0b3BfbWF0Y2hfQSB+ICJib2xkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9CID09IHRvcF9tYXRjaF9CIH4gImJvbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJwbGFpbiIpKSAlPiUKICAjIG11dGF0ZShjb25nID0gaWZlbHNlKGNvbmcgPT0gMSwgTkFfcmVhbF8sIGNvbmcpKSAlPiUKICBtdXRhdGUoc2FtcGxlX0EgPSBwYXN0ZSh0b3VwcGVyKGNvdW50cnlfQSksICJhZHVsdHMiLCBzZXAgPSAiOlxuIikpICU+JQogIG11dGF0ZShzYW1wbGVfQiA9IHBhc3RlKHRvdXBwZXIoY291bnRyeV9CKSwgImFkdWx0cyIsIHNlcCA9ICI6XG4iKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoY291bnRyeV9BLCBjb3VudHJ5X0IpLAogICAgICAgICAgICBmdW5zKGZhY3Rvcih0b3VwcGVyKC4pLCBsZXZlbHMgPSB0b3VwcGVyKGxldmVsc19jb3VudHJ5KSkpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3JfbGFiZGVzY3JpcHRfQSwKICAgICAgICAgICAgIHkgPSByZW9yZGVyKGZhY3Rvcl9sYWJkZXNjcmlwdF9CLCBkZXNjKGZhY3Rvcl9sYWJkZXNjcmlwdF9CKSksCiAgICAgICAgICAgICBmaWxsID0gY29uZykpICsKICBmYWNldF9ncmlkKHJlb3JkZXIoc2FtcGxlX0IsIGFzLm51bWVyaWMoY291bnRyeV9CKSkgfiAKICAgICAgICAgICAgICAgcmVvcmRlcihzYW1wbGVfQSwgYXMubnVtZXJpYyhjb3VudHJ5X0EpKSwgCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjYXNlX3doZW4oaXMubmEoY29uZykgfiAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBmb3JtYXQocm91bmQoY29uZywgMiksIG5zbWFsbCA9IDIpKSwKICAgICAgICAgICAgICAgIGZvbnRmYWNlID0gaXNfdG9wX21hdGNoLAogICAgICAgICAgICAgICAgY29sb3IgPSBpc190b3BfbWF0Y2gpLAogICAgICAgICAgICBzaXplID0gMywgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtyZWQiLCAiZGFya2JsdWUiLCAiYmxhY2siKSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJ2aXJpZGlzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJ3aWR0aCA9IDI1LCBiYXJoZWlnaHQgPSAwLjUpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIGZpbGwgPSBleHByZXNzaW9uKGl0YWxpYyhyW2NdKSkpCmBgYAoKIyMgQm9vdHN0cmFwcGVkIGNvbmdydWVuY2UKCmBgYHtyIGJvb3RzdHJhcCBjb25ncnVlbmNlIGFkdWx0c30KaWYgKGZpbGUuZXhpc3RzKCIuLi9yZXN1bHRzL2NvbmdfZGZfYWR1bHRzX29ibGlxdWUuUkRTIikpIHsKICAKICBjb25nX2RmX2FkdWx0cyA8LSByZWFkUkRTKCIuLi9yZXN1bHRzL2NvbmdfZGZfYWR1bHRzX29ibGlxdWUuUkRTIikKICAKfSBlbHNlIHsKICAKICBic19hZHVsdHMgPC0gbG9hZGluZ3NfYWR1bHRzICU+JQogICAgc2VsZWN0KGNhcGFjaXR5LCBmYWN0b3IsIGxvYWRpbmcpICU+JQogICAgc3ByZWFkKGZhY3RvciwgbG9hZGluZykgJT4lCiAgICBzZWxlY3QoLWNhcGFjaXR5KSAlPiUKICAgIHNqc3RhdHM6OmJvb3RzdHJhcCgxMDAwKSAKICAKICBmYWN0b3JzIDwtIGxldmVscyhmYWN0b3IobG9hZGluZ3NfYWR1bHRzJGZhY3RvcikpCiAgCiAgY29uZ19kZl9hZHVsdHMgPC0gZGF0YS5mcmFtZShOVUxMKQogIGZvciAoaSBpbiBmYWN0b3JzKSB7CiAgICBmb3IgKGogaW4gZmFjdG9ycykgewogICAgICBjbmFtZSA8LSBwYXN0ZShpLCBqLCBzZXAgPSAiLiIpCiAgICAgIHRlbXAgPC0gYnNfYWR1bHRzICU+JQogICAgICAgIG11dGF0ZShjb25nID0gbWFwX2RibChzdHJhcCwgfmxzYTo6Y29zaW5lKGFzLmRhdGEuZnJhbWUoLngpWyxpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKC54KVssal0pKSkKICAgICAgY29uZ19kZl9hZHVsdHNbMToxMDAwLCBjbmFtZV0gPC0gdGVtcCRjb25nCiAgICB9CiAgfQogIAogIGNvbmdfZGZfYWR1bHRzIDwtIGNvbmdfZGZfYWR1bHRzICU+JQogICAgZ2F0aGVyKGZhY3Rvcl9wYWlyLCBjb25nKSAlPiUKICAgIHNlcGFyYXRlKGZhY3Rvcl9wYWlyLCBpbnRvID0gYygiZmFjdG9yX0EiLCAiZmFjdG9yX0IiKSwgc2VwID0gIlxcLiIpICU+JQogICAgZ3JvdXBfYnkoZmFjdG9yX0EsIGZhY3Rvcl9CKSAlPiUKICAgIHN1bW1hcmlzZShtZWFuID0gbWVhbihjb25nKSwKICAgICAgICAgICAgICBjaV9sb3dlciA9IGNpX2xvd2VyKGNvbmcpLAogICAgICAgICAgICAgIGNpX3VwcGVyID0gY2lfdXBwZXIoY29uZykpICU+JQogICAgdW5ncm91cCgpICU+JQogICAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkEiLCBzZXAgPSAiXyIpKSkpICU+JQogICAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSkpCiAgCiAgcm0oaSwgaiwgY25hbWUsIHRlbXAsIGZhY3RvcnMpCiAgCiAgc2F2ZVJEUyhjb25nX2RmX2FkdWx0cywgZmlsZSA9ICIuLi9yZXN1bHRzL2NvbmdfZGZfYWR1bHRzX29ibGlxdWUuUkRTIikKfQpgYGAKCmBgYHtyIGNvbmcgbWluIGFkdWx0c30KIyBmaW5kIG1pbmltdW0gdmFsdWUgdG8gc2V0IGNvbnN0YW50IGxvd2VyIGJvdW5kIG9mIHBsb3RzCm1pbl9jb25nX2FkdWx0cyA8LSBjb25nX2RmX2FkdWx0cyAlPiUKICBzdW1tYXJpc2UobWluX2NvbmcgPSBtaW4oY2lfbG93ZXIsIG5hLnJtID0gVCkpCmBgYAoKYGBge3IgY29uZyBjaXMgdXMgYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIDMKY29uZ19wbG90X2Z1bihjb25nX2RmID0gY29uZ19kZl9hZHVsdHMsIHdoaWNoX2NvdW50cnkgPSAiVVMiKSArCiAgeWxpbShtaW5fY29uZ19hZHVsdHMkbWluX2NvbmcsIDEpICsKICAjIHlsaW0oTkEsIDEpICsKICBsYWJzKHggPSBOVUxMKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnMDNfb2JsaXF1ZS5wbmciKQpgYGAKCmBgYHtyIGNvbmcgY2lzIGdoIGJhc2UgYWR1bHRzLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC45fQojIEZJR1VSRSBTMQpjb25nX3Bsb3RfZnVuKGNvbmdfZGYgPSBjb25nX2RmX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgIG11dGF0ZV9hdCgjdmFycyhjb250YWlucygibGFiZGVzY3JpcHQiKSksCiAgICAgICAgICAgICAgICAgIHZhcnMoZmFjdG9yX2xhYmRlc2NyaXB0X0EpLAogICAgICAgICAgICAgICAgICBmdW5zKGdzdWIoIiBcXCgiLCAiXG5cXCgiLCAuKSkpICU+JQogICAgICAgICAgICAgICAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgICAgICAgICAgICAgICAgdmFycyhmYWN0b3JfbGFiZGVzY3JpcHRfQSksCiAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiXFwvIiwgIlxcL1xuIiwgLikpKSwgCiAgICAgICAgICAgICAgd2hpY2hfY291bnRyeSA9ICJHaGFuYSIpICsKICB5bGltKG1pbl9jb25nX2FkdWx0cyRtaW5fY29uZywgMSkKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZ1MwMV9vYmxpcXVlLnBuZyIpCmBgYAoKYGBge3IgY29uZyBjaXMgdGggYmFzZSBhZHVsdHMsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjl9CiMgRklHVVJFIFMyCmNvbmdfcGxvdF9mdW4oY29uZ19kZiA9IGNvbmdfZGZfYWR1bHRzLCAKICAgICAgICAgICAgICB3aGljaF9jb3VudHJ5ID0gIlRoYWlsYW5kIikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzAyX29ibGlxdWUucG5nIikKYGBgCgpgYGB7ciBjb25nIGNpcyBjaCBiYXNlIGFkdWx0cywgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuOX0KIyBGSUdVUkUgUzMKY29uZ19wbG90X2Z1bihjb25nX2RmID0gY29uZ19kZl9hZHVsdHMsIAogICAgICAgICAgICAgIHdoaWNoX2NvdW50cnkgPSAiQ2hpbmEiKSArCiAgeWxpbShtaW5fY29uZ19hZHVsdHMkbWluX2NvbmcsIDEpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWdTMDNfb2JsaXF1ZS5wbmciKQpgYGAKCmBgYHtyIGNvbmcgY2lzIHZ0IGJhc2UgYWR1bHRzLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC45fQojIEZJR1VSRSBTNApjb25nX3Bsb3RfZnVuKGNvbmdfZGYgPSBjb25nX2RmX2FkdWx0cyAlPiUKICAgICAgICAgICAgICAgIG11dGF0ZV9hdCgjdmFycyhjb250YWlucygibGFiZGVzY3JpcHQiKSksCiAgICAgICAgICAgICAgICAgIHZhcnMoZmFjdG9yX2xhYmRlc2NyaXB0X0EpLAogICAgICAgICAgICAgICAgICBmdW5zKGdzdWIoIiBcXCgiLCAiXG5cXCgiLCAuKSkpICU+JQogICAgICAgICAgICAgICAgbXV0YXRlX2F0KCN2YXJzKGNvbnRhaW5zKCJsYWJkZXNjcmlwdCIpKSwKICAgICAgICAgICAgICAgICAgdmFycyhmYWN0b3JfbGFiZGVzY3JpcHRfQSksCiAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiXFwvIiwgIlxcL1xuIiwgLikpKSwgCiAgICAgICAgICAgICAgd2hpY2hfY291bnRyeSA9ICJWYW51YXR1IikgKwogIHlsaW0obWluX2NvbmdfYWR1bHRzJG1pbl9jb25nLCAxKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA0X29ibGlxdWUucG5nIikKYGBgCgpgYGB7ciBib2R5IG1pbmQgY29uZyBhZHVsdHN9CiMgIkluIGVhY2ggc2FtcGxlLCB0aGVyZSB3YXMgYSBmYWN0b3IgdGhhdCB3YXMgc2ltaWxhciB0byBVUyBhZHVsdHPigJkg4oCcYm9keeKAnSBmYWN0b3IuLi4KY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSwgCiAgICAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpLAogICAgICAgICBjb3VudHJ5X0EgIT0gIlVTIiwgY291bnRyeV9CID09ICJVUyIpCgojICIuLi5hbmQgbm90IHNpbWlsYXIgdG8gdGhlIFVTIGFkdWx0IOKAnG1pbmTigJ0gZmFjdG9yLCAuLi4KY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSwgCiAgICAgICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpLAogICAgICAgICBjb3VudHJ5X0EgIT0gIlVTIiwgY291bnRyeV9CID09ICJVUyIpCgojICIuLi4gYW5kIGEgZmFjdG9yIHRoYXQgd2FzIG11Y2ggbW9yZSBzaW1pbGFyIHRvIFVTIGFkdWx0c+KAmSDigJxtaW5k4oCdIGZhY3Rvci4uLgpjb25nX2RmX2FkdWx0cyAlPiUgCiAgZmlsdGVyKGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpLCAKICAgICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSksCiAgICAgICAgIGNvdW50cnlfQSAhPSAiVVMiLCBjb3VudHJ5X0IgPT0gIlVTIikKCiMgIi4uLnRoYW4gdGhlIFVTIGFkdWx0IOKAnGJvZHnigJ0gZmFjdG9yLiIKY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSwgCiAgICAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpLAogICAgICAgICBjb3VudHJ5X0EgIT0gIlVTIiwgY291bnRyeV9CID09ICJVUyIpCmBgYApgYGB7ciBoZWFydCBjb25nIGFkdWx0c30KY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSksIAogICAgICAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSksCiAgICAgICAgIGNvdW50cnlfQSAlaW4lIGMoIlRoYWlsYW5kIiwgIkNoaW5hIiksIGNvdW50cnlfQiA9PSAiVVMiKQoKY29uZ19kZl9hZHVsdHMgJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSB8IAogICAgICAgICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpLAogICAgICAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSksCiAgICAgICAgIGNvdW50cnlfQSAlaW4lIGMoIlRoYWlsYW5kIiwgIkNoaW5hIiksIGNvdW50cnlfQiA9PSAiVVMiKQpgYGAKCgojIENoaWxkcmVuCgojIyBTYW1wbGVzCgpgYGB7ciBzYW1wbGVzIGNoaWxkcmVufQpiaW5kX3Jvd3MoZF91c19jaGlsZHJlbiwgZF9naF9jaGlsZHJlbiwgZF90aF9jaGlsZHJlbiwgZF9jaF9jaGlsZHJlbiwgZF92dF9jaGlsZHJlbikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBkaXN0aW5jdChjb3VudHJ5LCBzdWJqX2lkKSAlPiUKICBjb3VudChjb3VudHJ5KSAlPiUgCiAgamFuaXRvcjo6YWRvcm5fdG90YWxzKCkKYGBgCgojIyBTY2FsZSB1c2UKCmBgYHtyIHNjYWxlIHVzZSBtZWFuIG92ZXJhbGwgY2hpbGRyZW59CmJpbmRfcm93cyhkX3VzX2NoaWxkcmVuLCBkX2doX2NoaWxkcmVuLCBkX3RoX2NoaWxkcmVuLCBkX2NoX2NoaWxkcmVuLCBkX3Z0X2NoaWxkcmVuKSAlPiUKICBtdXRhdGUoY291bnRyeSA9IGZhY3Rvcihjb3VudHJ5LCBsZXZlbHMgPSBsZXZlbHNfY291bnRyeSksCiAgICAgICAgIHJlc3BvbnNlX2NhdCA9IHJlY29kZV9mYWN0b3IocmVzcG9uc2VfY2F0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyIgPSAibm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJraW5kIG9mIiA9ICJraW5kIG9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVzIiA9ICJ5ZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWlzc2luZyA9ICJtaXNzaW5nIGRhdGEiKSkgJT4lCiAgY291bnQoY291bnRyeSwgcmVzcG9uc2VfY2F0KSAlPiUKICBjb21wbGV0ZShyZXNwb25zZV9jYXQsIG5lc3RpbmcoY291bnRyeSksIGZpbGwgPSBsaXN0KG4gPSAwKSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKHByb3AgPSBuL3N1bShuLCBuYS5ybSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KC1uKSAlPiUKICBzcHJlYWQocmVzcG9uc2VfY2F0LCBwcm9wKSAlPiUKICBqYW5pdG9yOjphZG9ybl9wY3RfZm9ybWF0dGluZyhkaWdpdHMgPSAyKQpgYGAKCiMjIEZhY3RvciByZXRlbnRpb246IHBhcmFsbGVsIGFuYWx5c2lzCgpgYGB7ciBwYXJhbGxlbCBkaXN0IGNoaWxkcmVuLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC41fQojIE5PVEU6IHRoZXJlIGFwcGVhcnMgdG8gYmUgc29tZSB1bnJlbGlhYmlsaXR5L25vbi1yZXByb2R1Y2liaWxpdHkgaW4gcmVzdWx0cywgZXNwZWNpYWxseSBmb3IgdnQgYWR1bHRzLCB3aGljaCBJIGRvbid0IHVuZGVyc3RhbmQgLS0gc28gaGVyZSdzIHRoZSBkaXN0cmlidXRpb24gb3ZlciBvdXRjb21lcyBvZiBwYXJhbGxlbCBhbmFseXNpcyB3aXRoIDEwMCBpdGVyYXRpb25zLiBXZSdsbCBjaG9vc2UgdGhlIG1lZGlhbiBudW1iZXIgb2YgZmFjdG9ycy4KCmlmIChmaWxlLmV4aXN0cygiLi4vcmVzdWx0cy9wYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuLlJEUyIpKSB7CiAgCiAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiA8LSByZWFkUkRTKCIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4uUkRTIikKICAKfSBlbHNlIHsKICAKICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuIDwtIGRhdGEuZnJhbWUodXMgPSBOVUxMLCBnaCA9IE5VTEwsIHRoID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBOVUxMLCB2dCA9IE5VTEwpCiAgCiAgc2V0LnNlZWQoNTQzMjEpCiAgbl9jb3JlcyA8LSBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKQogIG9wdGlvbnMobWMuY29yZXMgPSBuX2NvcmVzKQogIAogIGZvciAoaSBpbiAxOjEwMCkgewogICAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbltpLCAidXMiXSA8LSBmYS5wYXJhbGxlbChkX3VzX2NoaWxkcmVuX3csIHBsb3QgPSBGKSRuZmFjdAogICAgcGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbltpLCAiZ2giXSA8LSBmYS5wYXJhbGxlbChkX2doX2NoaWxkcmVuX3csIHBsb3QgPSBGKSRuZmFjdCAgICAgCiAgICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuW2ksICJ0aCJdIDwtIGZhLnBhcmFsbGVsKGRfdGhfY2hpbGRyZW5fdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuW2ksICJjaCJdIDwtIGZhLnBhcmFsbGVsKGRfY2hfY2hpbGRyZW5fdywgcGxvdCA9IEYpJG5mYWN0CiAgICBwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuW2ksICJ2dCJdIDwtIGZhLnBhcmFsbGVsKGRfdnRfY2hpbGRyZW5fdywgcGxvdCA9IEYpJG5mYWN0CiAgfQogIAogIHNhdmVSRFMocGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiwgZmlsZSA9ICIuLi9yZXN1bHRzL3BhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4uUkRTIikKfQoKIyBwbG90CnBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4gJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJpdGVyIikgJT4lCiAgZ2F0aGVyKGNvdW50cnksIG5mYWN0LCAtaXRlcikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ1cyIsICJnaCIsICJ0aCIsICJjaCIsICJ2dCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVsc19jb3VudHJ5KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbmZhY3QpKSArCiAgZmFjZXRfZ3JpZCh+IGNvdW50cnkpICsKICBnZW9tX2JhcihzdGF0ID0gImNvdW50IikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDEsIG1heChwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuKSArIDEpLAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMCwgMTAwLCAxKSkgKwogIGxhYnMoeCA9ICJOdW1iZXIgb2YgZmFjdG9ycyBzdWdnZXN0ZWQgYnkgZmEucGFyYWxsZWwoKSIpCmBgYAoKIyMgRXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzCgpgYGB7ciBlZmEgY2hpbGRyZW59CnNldC5zZWVkKDU0MzIxKQoKIyBkbyBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXM6IGNoaWxkcmVuCmVmYV91c19jaGlsZHJlbiA8LSBmYV9mdW4oZF91c19jaGlsZHJlbl93LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kdXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9uLml0ZXIgPSAxMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV91c19jaGlsZHJlbiRsb2FkaW5ncykgPC0gcGFzdGUwKCJ1c0NISUxEUkVOXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdXNfY2hpbGRyZW4kbG9hZGluZ3MpKQoKZWZhX2doX2NoaWxkcmVuIDwtIGZhX2Z1bihkX2doX2NoaWxkcmVuX3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG1lZGlhbihwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuJGdoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fcm90ID0gIm9ibGltaW4iKQpjb2xuYW1lcyhlZmFfZ2hfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgiZ2hDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX2doX2NoaWxkcmVuJGxvYWRpbmdzKSkKCmVmYV90aF9jaGlsZHJlbiA8LSBmYV9mdW4oZF90aF9jaGlsZHJlbl93LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbWVkaWFuKHBhX291dGNvbWVzX2Rpc3RfY2hpbGRyZW4kdGgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9uLml0ZXIgPSAxMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNob3Nlbl9yb3QgPSAib2JsaW1pbiIpCmNvbG5hbWVzKGVmYV90aF9jaGlsZHJlbiRsb2FkaW5ncykgPC0gcGFzdGUwKCJ0aENISUxEUkVOXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdGhfY2hpbGRyZW4kbG9hZGluZ3MpKQoKZWZhX2NoX2NoaWxkcmVuIDwtIGZhX2Z1bihkX2NoX2NoaWxkcmVuX3csIAogICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBtZWRpYW4ocGFfb3V0Y29tZXNfZGlzdF9jaGlsZHJlbiRjaCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX24uaXRlciA9IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuX3JvdCA9ICJvYmxpbWluIikKY29sbmFtZXMoZWZhX2NoX2NoaWxkcmVuJGxvYWRpbmdzKSA8LSBwYXN0ZTAoImNoQ0hJTERSRU5fIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV9jaF9jaGlsZHJlbiRsb2FkaW5ncykpCgplZmFfdnRfY2hpbGRyZW4gPC0gZmFfZnVuKGRfdnRfY2hpbGRyZW5fdywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG1lZGlhbihwYV9vdXRjb21lc19kaXN0X2NoaWxkcmVuJHZ0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fbi5pdGVyID0gMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9zZW5fcm90ID0gIm9ibGltaW4iKQpjb2xuYW1lcyhlZmFfdnRfY2hpbGRyZW4kbG9hZGluZ3MpIDwtIHBhc3RlMCgidnRDSElMRFJFTl8iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX3Z0X2NoaWxkcmVuJGxvYWRpbmdzKSkKYGBgCgpgYGB7ciBmYWN0b3IgbmFtZXMgY2hpbGRyZW59CmZhY3Rvcl9uYW1lc19jaGlsZHJlbiA8LSBkYXRhLmZyYW1lKGZhY3RvciA9IGMoY29sbmFtZXMoZWZhX3VzX2NoaWxkcmVuJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfZ2hfY2hpbGRyZW4kbG9hZGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWVzKGVmYV90aF9jaGlsZHJlbiRsb2FkaW5ncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXMoZWZhX2NoX2NoaWxkcmVuJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhlZmFfdnRfY2hpbGRyZW4kbG9hZGluZ3MpKSkgJT4lCiAgbXV0YXRlKGFnZV9ncm91cCA9ICJjaGlsZHJlbiIpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gY2FzZV93aGVuKGdyZXBsKCJedXMiLCBmYWN0b3IpIH4gIlVTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXmdoIiwgZmFjdG9yKSB+ICJHaGFuYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIl50aCIsIGZhY3RvcikgfiAiVGhhaWxhbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJeY2giLCBmYWN0b3IpIH4gIkNoaW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiXnZ0IiwgZmFjdG9yKSB+ICJWYW51YXR1IiksCiAgICAgICAgIGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBtdXRhdGUoZmFjdG9yX25hbWUgPSBnc3ViKCJedXMiLCAiVVMgIiwgZmFjdG9yKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJeZ2giLCAiR2guICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJedGgiLCAiVGguICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJeY2giLCAiQ2guICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJednQiLCAiVmEuICIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJDSElMRFJFTiIsICJjaGlsZHJlbiIsIGZhY3Rvcl9uYW1lKSwKICAgICAgICAgZmFjdG9yX25hbWUgPSBnc3ViKCJfRiIsICIgRmFjdG9yICIsIGZhY3Rvcl9uYW1lKSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9kZXNjcmlwdCA9IHJlY29kZShmYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0NISUxEUkVOX0YxID0gIkJvZHktbGlrZSwgbmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNDSElMRFJFTl9GMyA9ICJIZWFydC1saWtlLCBwb3NpdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c0NISUxEUkVOX0YyID0gIk1pbmQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaENISUxEUkVOX0YxID0gIkJvZHktbGlrZSwgbmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2hDSElMRFJFTl9GMiA9ICJNaW5kLWxpa2UsIHBvc2l0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdoQ0hJTERSRU5fRjMgPSAiUHJheSwgYWRkLCBldGMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQ0hJTERSRU5fRjEgPSAiQm9keS1saWtlLCBwb3NpdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aENISUxEUkVOX0YyID0gIkhlYXJ0LWxpa2UsIG5lZ2F0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQ0hJTERSRU5fRjMgPSAiTWluZC1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoQ0hJTERSRU5fRjQgPSAiQWRkLCBwcmF5LCBldGMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ0hJTERSRU5fRjEgPSAiSGVhcnQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENISUxEUkVOX0YyID0gIkJvZHktbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENISUxEUkVOX0YzID0gIk1pbmQtbGlrZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENISUxEUkVOX0Y0ID0gIlByYXksIGV0Yy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRDSElMRFJFTl9GMSA9ICJCb2R5LWxpa2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRDSElMRFJFTl9GMiA9ICJNaW5kLWxpa2UsIHBvc2l0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0Q0hJTERSRU5fRjMgPSAiSGVhcnQtbGlrZSwgbmVnYXRpdmUiKSwKICAgICAgICAgZmFjdG9yX2xhYmRlc2NyaXB0ID0gcGFzdGUoZ3N1YigiLipfRiIsICJGIiwgZmFjdG9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2Rlc2NyaXB0LCBzZXAgPSAiOiAiKSkKYGBgCgojIyBGYWN0b3IgbG9hZGluZ3MKCmBgYHtyIG9yZGVyIGNoaWxkcmVufQojIG9yZGVyIGNhcGFjaXRpZXM6IGNoaWxkcmVuCm9yZGVyX3VzX2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX3VzX2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX2doX2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX2doX2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX3RoX2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX3RoX2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX2NoX2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX2NoX2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCm9yZGVyX3Z0X2NoaWxkcmVuIDwtIGZhLnNvcnQoZWZhX3Z0X2NoaWxkcmVuKSRsb2FkaW5nc1tdICU+JSByb3duYW1lcygpCmBgYAoKYGBge3IgbG9hZGluZ3MgY2hpbGRyZW59CiMgY29tcGlsZSBsb2FkaW5nczogY2hpbGRyZW4KbG9hZGluZ3NfY2hpbGRyZW4gPC0gYmluZF9yb3dzKAogIGxvYWRpbmdzX2Z1bihlZmFfdXNfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJVUyIpLAogIGxvYWRpbmdzX2Z1bihlZmFfZ2hfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJHaGFuYSIpLAogIGxvYWRpbmdzX2Z1bihlZmFfdGhfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJUaGFpbGFuZCIpLAogIGxvYWRpbmdzX2Z1bihlZmFfY2hfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJDaGluYSIpLAogIGxvYWRpbmdzX2Z1bihlZmFfdnRfY2hpbGRyZW4pICU+JSBtdXRhdGUoY291bnRyeSA9ICJWYW51YXR1IikpICU+JQogIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIGxldmVscyA9IGxldmVsc19jb3VudHJ5KSwKICAgICAgICAgY2FwYWNpdHlfb3JkX3VzID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl91c19jaGlsZHJlbiksCiAgICAgICAgIGNhcGFjaXR5X29yZF9naCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfZ2hfY2hpbGRyZW4pLAogICAgICAgICBjYXBhY2l0eV9vcmRfdGggPSBmYWN0b3IoY2FwYWNpdHksIGxldmVscyA9IG9yZGVyX3RoX2NoaWxkcmVuKSwKICAgICAgICAgY2FwYWNpdHlfb3JkX2NoID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSBvcmRlcl9jaF9jaGlsZHJlbiksCiAgICAgICAgIGNhcGFjaXR5X29yZF92dCA9IGZhY3RvcihjYXBhY2l0eSwgbGV2ZWxzID0gb3JkZXJfdnRfY2hpbGRyZW4pKSAlPiUKICBhcnJhbmdlKGNvdW50cnksIGZhY3RvciwgZGVzYyhhYnMobG9hZGluZykpLCBjYXBhY2l0eSkgJT4lCiAgbXV0YXRlKG9yZGVyID0gMTpucm93KC4pKSAlPiUKICBsZWZ0X2pvaW4oZmFjdG9yX25hbWVzX2NoaWxkcmVuKQpgYGAKCmBgYHtyIGhlYXRtYXBzIGJ5IHNpdGUgY2hpbGRyZW4sIGZpZy53aWR0aCA9IDE1LCBmaWcuYXNwID0gMC4yNX0KcGxvdF9ncmlkKGhlYXRtYXBfZnVuKGVmYV91c19jaGlsZHJlbiwgCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJVUyIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIlVTOiBjaGlsZHJlbiIpLAogICAgICAgICAgaGVhdG1hcF9mdW4oZWZhX2doX2NoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiR2hhbmEiKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGZhY3Rvcl9sYWJkZXNjcmlwdCkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdCgpKSArIAogICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgICAgICAgICAgbGFicyh0aXRsZSA9ICJHSEFOQTogY2hpbGRyZW4iKSwKICAgICAgICAgIGhlYXRtYXBfZnVuKGVmYV90aF9jaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19jaGlsZHJlbiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGNvdW50cnkgPT0gIlRoYWlsYW5kIikgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChmYWN0b3JfbGFiZGVzY3JpcHQpICU+JQogICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoKSkgKyAKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgICAgIGxhYnModGl0bGUgPSAiVEhBSUxBTkQ6IGNoaWxkcmVuIiksCiAgICAgICAgICBoZWF0bWFwX2Z1bihlZmFfY2hfY2hpbGRyZW4sCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJDaGluYSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIkNISU5BOiBjaGlsZHJlbiIpLAogICAgICAgICAgaGVhdG1hcF9mdW4oZWZhX3Z0X2NoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY291bnRyeSA9PSAiVmFudWF0dSIpICU+JQogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoZmFjdG9yX2xhYmRlc2NyaXB0KSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkpICsgCiAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgICAgICBsYWJzKHRpdGxlID0gIlZBTlVBVFU6IGNoaWxkcmVuIiksCiAgICAgICAgICBuY29sID0gNSkKYGBgCgpgYGB7ciBoZWF0bWFwIGNoaWxkcmVuLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC43fQojIG1ha2UgaGVhdG1hcCBmaWd1cmU6IGNoaWxkcmVuCmxvYWRpbmdzX2NoaWxkcmVuICU+JQogIG11dGF0ZShmYWN0b3JfbnVtID0gYXMubnVtZXJpYyhnc3ViKCIuKkYiLCAiIiwgZmFjdG9yKSkpICU+JQogIG11dGF0ZShzYW1wbGUgPSBwYXN0ZShjb3VudHJ5LCAiY2hpbGRyZW4iLCBzZXAgPSAiXG4iKSkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19jaGlsZHJlbikgJT4lCiAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwgbGV2ZWxzID0gbGV2ZWxzX2NvdW50cnkpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGZhY3Rvcl9sYWJkZXNjcmlwdCwgZmFjdG9yX251bSksIAogICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3VzKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF9lYykpLCAKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX2doKSksCiAgICAgICAgICAgICAjIHkgPSByZW9yZGVyKGNhcGFjaXR5LCBkZXNjKGNhcGFjaXR5X29yZF90aCkpLAogICAgICAgICAgICAgIyB5ID0gcmVvcmRlcihjYXBhY2l0eSwgZGVzYyhjYXBhY2l0eV9vcmRfY2gpKSwKICAgICAgICAgICAgICMgeSA9IHJlb3JkZXIoY2FwYWNpdHksIGRlc2MoY2FwYWNpdHlfb3JkX3Z0KSksCiAgICAgICAgICAgICBmaWxsID0gbG9hZGluZykpICsKICBmYWNldF9ncmlkKH4gcmVvcmRlcihzYW1wbGUsIGFzLm51bWVyaWMoY291bnRyeSkpLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQobG9hZGluZywgMiksIG5zbWFsbCA9IDIpKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gMjAsIGJhcndpZHRoID0gMC41KSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoMC44LCAibGluZXMiKSwKICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSAiQ2FwYWNpdHkiLCBmaWxsID0gIkZhY3RvclxubG9hZGluZyIpCmBgYAoKIyMgQ29uZ3J1ZW5jZQoKU2VlIFtBbGwgc2FtcGxlc10sIGJlbG93LgoKIyMgQm9vdHN0cmFwcGVkIGNvbmdydWVuY2UKCmBgYHtyIGJvb3RzdHJhcCBjb25ncnVlbmNlIGNoaWxkcmVufQppZiAoZmlsZS5leGlzdHMoIi4uL3Jlc3VsdHMvY29uZ19kZl9jaGlsZHJlbl9vYmxpcXVlLlJEUyIpKSB7CiAgCiAgY29uZ19kZl9jaGlsZHJlbiA8LSByZWFkUkRTKCIuLi9yZXN1bHRzL2NvbmdfZGZfY2hpbGRyZW5fb2JsaXF1ZS5SRFMiKQogIAp9IGVsc2UgewogIAogIGJzX2NoaWxkcmVuIDwtIGxvYWRpbmdzX2NoaWxkcmVuICU+JQogICAgc2VsZWN0KGNhcGFjaXR5LCBmYWN0b3IsIGxvYWRpbmcpICU+JQogICAgc3ByZWFkKGZhY3RvciwgbG9hZGluZykgJT4lCiAgICBmdWxsX2pvaW4obG9hZGluZ3NfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBmYWN0b3IsIGxvYWRpbmcpICU+JQogICAgICAgICAgICAgICAgc3ByZWFkKGZhY3RvciwgbG9hZGluZykpICU+JQogICAgc2VsZWN0KC1jYXBhY2l0eSkgJT4lCiAgICBzanN0YXRzOjpib290c3RyYXAoMTAwMCkgCiAgCiAgY29uZ19kZl9jaGlsZHJlbiA8LSBkYXRhLmZyYW1lKE5VTEwpCiAgCiAgZm9yIChrIGluIGxldmVsc19jb3VudHJ5KSB7CiAgICAKICAgIGZhY3RvcnNfY2hpbGRyZW4gPC0gbGV2ZWxzKGZhY3Rvcihsb2FkaW5nc19jaGlsZHJlbiRmYWN0b3JbCiAgICAgIGxvYWRpbmdzX2NoaWxkcmVuJGNvdW50cnkgPT0ga10pKQogICAgZmFjdG9yc19hZHVsdHMgPC0gbGV2ZWxzKGZhY3Rvcihsb2FkaW5nc19hZHVsdHMkZmFjdG9yWwogICAgICBsb2FkaW5nc19hZHVsdHMkY291bnRyeSA9PSBrXSkpCiAgICAKICAgIGZvciAoaSBpbiBmYWN0b3JzX2NoaWxkcmVuKSB7CiAgICAgIGZvciAoaiBpbiBmYWN0b3JzX2FkdWx0cykgewogICAgICAgIGNuYW1lIDwtIHBhc3RlKGksIGosIHNlcCA9ICIuIikKICAgICAgICB0ZW1wIDwtIGJzX2NoaWxkcmVuICU+JQogICAgICAgICAgbXV0YXRlKGNvbmcgPSBtYXBfZGJsKHN0cmFwLCB+bHNhOjpjb3NpbmUoYXMuZGF0YS5mcmFtZSgueClbLGldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZSgueClbLGpdKSkpCiAgICAgICAgY29uZ19kZl9jaGlsZHJlblsxOjEwMDAsIGNuYW1lXSA8LSB0ZW1wJGNvbmcKICAgICAgfQogICAgfQogICAgCiAgICBybShpLCBqLCBjbmFtZSwgdGVtcCwgZmFjdG9yc19jaGlsZHJlbiwgZmFjdG9yc19hZHVsdHMpCiAgICAKICB9CiAgCiAgcm0oaykKICAKICBjb25nX2RmX2NoaWxkcmVuIDwtIGNvbmdfZGZfY2hpbGRyZW4gJT4lCiAgICBnYXRoZXIoZmFjdG9yX3BhaXIsIGNvbmcpICU+JQogICAgc2VwYXJhdGUoZmFjdG9yX3BhaXIsIGludG8gPSBjKCJmYWN0b3JfQSIsICJmYWN0b3JfQiIpLCBzZXAgPSAiXFwuIikgJT4lCiAgICBncm91cF9ieShmYWN0b3JfQSwgZmFjdG9yX0IpICU+JQogICAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGNvbmcpLAogICAgICAgICAgICAgIGNpX2xvd2VyID0gY2lfbG93ZXIoY29uZyksCiAgICAgICAgICAgICAgY2lfdXBwZXIgPSBjaV91cHBlcihjb25nKSkgJT4lCiAgICB1bmdyb3VwKCkgJT4lCiAgICBmdWxsX2pvaW4oZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJBIiwgc2VwID0gIl8iKSkpKSAlPiUKICAgIGZ1bGxfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJCIiwgc2VwID0gIl8iKSkpKSAlPiUKICAgIG11dGF0ZShmYWN0b3JfYmhtX0EgPSBjYXNlX3doZW4oCiAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIH4gIkJvZHktbGlrZVxuY2hpbGQgZmFjdG9yIiwKICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSkgfiAiTWluZC1saWtlXG5jaGlsZCBmYWN0b3IiLAogICAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9BKSkgfiAiSGVhcnQtbGlrZVxuY2hpbGQgZmFjdG9yIiwKICAgICAgVFJVRSB+ICJPdGhlciIpKSAlPiUKICAgIG11dGF0ZShmYWN0b3JfYmhtX0IgPSBjYXNlX3doZW4oCiAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpIH4gIkxvY2FsIGFkdWx0czpcbkJvZHktbGlrZSBmYWN0b3IiLAogICAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0IpKSB+ICJMb2NhbCBhZHVsdHM6XG5NaW5kLWxpa2UgZmFjdG9yIiwKICAgICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpIH4gIkxvY2FsIGFkdWx0czpcbkhlYXJ0LWxpa2UgZmFjdG9yIiwKICAgICAgVFJVRSB+ICJMb2NhbCBhZHVsdHM6XG5PdGhlciBmYWN0b3IiKSkKICAKICBzYXZlUkRTKGNvbmdfZGZfY2hpbGRyZW4sIGZpbGUgPSAiLi4vcmVzdWx0cy9jb25nX2RmX2NoaWxkcmVuX29ibGlxdWUuUkRTIikKfQpgYGAKCmBgYHtyIGNvbmcgbWluIGNoaWxkcmVufQojIGZpbmQgbWluaW11bSB2YWx1ZSB0byBzZXQgY29uc3RhbnQgbG93ZXIgYm91bmQgb2YgcGxvdHMKbWluX2NvbmdfY2hpbGRyZW4gPC0gY29uZ19kZl9jaGlsZHJlbiAlPiUKICBzdW1tYXJpc2UobWluX2NvbmcgPSBtaW4oY2lfbG93ZXIsIG5hLnJtID0gVCkpCmBgYAoKYGBge3IgY29uZyBjaXMgY2hpbGRyZW4sIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLjR9CiMgRklHVVJFIDQKIyBmaWcuYXNwIGNob3NlbiB0byBrZWVwIGFic29sdXRlIGhlaWdodCBvZiB5LWF4aXMgcmVsYXRpdmVseSBzaW1pbGFyIGFjcm9zcyBhZHVsdHMgYW5kIGNoaWxkcmVuCmNvbmdfZGZfY2hpbGRyZW4gJT4lCiAgbXV0YXRlKHJlZ2lvbl9BID0gY2FzZV93aGVuKAogICAgY291bnRyeV9BID09ICJVUyIgfiAiU0YgQmF5IEFyZWEiLAogICAgY291bnRyeV9BID09ICJHaGFuYSIgfiAiQ2FwZSBDb2FzdCIsCiAgICBjb3VudHJ5X0EgPT0gIlRoYWlsYW5kIiB+ICJDaGlhbmcgTWFpIiwKICAgIGNvdW50cnlfQSA9PSAiQ2hpbmEiIH4gIlNoYW5naGFpIiwKICAgIGNvdW50cnlfQSA9PSAiVmFudWF0dSIgfiAiUFYgJiBNYWxla3VsYSIpKSAlPiUKICBtdXRhdGUoc2FtcGxlX0EgPSBwYXN0ZShjb3VudHJ5X0EsIGFnZV9ncm91cF9BLCBzZXAgPSAiXG4iKSkgJT4lCiAgbXV0YXRlKGxhYl9BID0gcGFzdGUocGFzdGUwKHJlZ2lvbl9BLCAiLCIpLCAKICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAodG91cHBlcihjb3VudHJ5X0EpLCAiOiIpLCAKICAgICAgICAgICAgICAgICAgICAgICBhZ2VfZ3JvdXBfQSwgc2VwID0gIlxuIikpICU+JQogIGdncGxvdChhZXMoeCA9IGZhY3Rvcl9sYWJkZXNjcmlwdF9BLCB5ID0gbWVhbikpICsKICBmYWNldF9ncmlkKGZhY3Rvcl9iaG1fQiB+IHJlb3JkZXIobGFiX0EsIGFzLm51bWVyaWMoY291bnRyeV9BKSksIAogICAgICAgICAgICAgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWVfeCIpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IDAuODUsCiAgICAgICAgICAgZmlsbCA9ICJncmF5MjAiLCBhbHBoYSA9IDAuMikgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAwLjg1LCB5bWF4ID0gMC45NSwKICAgICAgICAgICBmaWxsID0gdmlyaWRpc0xpdGU6OnZpcmlkaXMoMiwgYmVnaW4gPSAwLjc1LzIsIGVuZCA9IDAuNzUpWzFdLCBhbHBoYSA9IDAuMikgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAwLjk1LCB5bWF4ID0gSW5mLAogICAgICAgICAgIGZpbGwgPSB2aXJpZGlzTGl0ZTo6dmlyaWRpcygyLCBiZWdpbiA9IDAuNzUvMiwgZW5kID0gMC43NSlbMl0sIGFscGhhID0gMC4yKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC44NSwgbHR5ID0gMiwgY29sb3IgPSAiZ3JheTEwIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuOTUsIGx0eSA9IDIsIGNvbG9yID0gImdyYXkxMCIpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgZmF0dGVuID0gMywKICAgICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChtZWFuLCAyKSwgbnNtYWxsID0gMiksCiAgICAgICAgICAgICAgICB5ID0gaWZlbHNlKGNpX2xvd2VyIDwgMC4yLCBjaV91cHBlciArIDAuMDUsIGNpX2xvd2VyIC0gMC4wNSksCiAgICAgICAgICAgICAgICB2anVzdCA9IGlmZWxzZShjaV9sb3dlciA8IDAuMiwgMCwgMSkpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMSwgMSwgMC4yKSwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gZXhwYW5zaW9uKGFkZCA9IDAuMDUpKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBhZXN0aGV0aWNzID0gYygiY29sb3IiLCAiZmlsbCIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IDIxOjI1KSArCiAgbGFicyh4ID0gTlVMTCwKICAgICAgIHkgPSBleHByZXNzaW9uKCJTaW1pbGFyaXR5ICIoaXRhbGljKHJbY10pKSkpICsgCiAgZ3VpZGVzKGNvbG9yID0gIm5vbmUiLCBmaWxsID0gIm5vbmUiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwKICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbCA9IHNjYWxlczo6YWxwaGEoIndoaXRlIiwgMCksIGNvbG9yID0gImJsYWNrIiksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpLCAKICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYyg1LjUsIDUuNSwgNS41LCAxNS41KSwgInBvaW50IikpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWcwNF9vYmxpcXVlLnBuZyIpCmBgYAoKYGBge3IgYm9keSBtaW5kIGNvbmcgY2hpbGRyZW59CiMgIkluIGVhY2ggc2FtcGxlLCB0aGVyZSB3YXMgYSBmYWN0b3IgdGhhdCB3YXMgbXVjaCBtb3JlIHNpbWlsYXIgdG8gbG9jYWwgYWR1bHRz4oCZIOKAnGJvZHktbGlrZeKAnSBmYWN0b3IuLi4KY29uZ19kZl9jaGlsZHJlbiAlPiUgCiAgZmlsdGVyKGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfYmhtX0EpKSwgCiAgICAgICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfYmhtX0IpKSkKCiMgIi4uLnRoYW4gdGhlaXIg4oCcbWluZC1saWtl4oCdIGZhY3RvciwgLi4uCmNvbmdfZGZfY2hpbGRyZW4gJT4lIAogIGZpbHRlcihncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2JobV9BKSksIAogICAgICAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2JobV9CKSkpCgojICIuLi4gYW5kIGEgZmFjdG9yIHRoYXQgd2FzIG11Y2ggbW9yZSBzaW1pbGFyIHRvIGxvY2FsIGFkdWx0c+KAmSDigJxtaW5kLWxpa2XigJ0gZmFjdG9yLi4uCmNvbmdfZGZfY2hpbGRyZW4gJT4lIAogIGZpbHRlcihncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2JobV9BKSksIAogICAgICAgICBncmVwbCgibWluZCIsIHRvbG93ZXIoZmFjdG9yX2JobV9CKSkpCgojICIuLi50aGFuIHRoZWlyIOKAnGJvZHktbGlrZeKAnSBmYWN0b3IuIgpjb25nX2RmX2NoaWxkcmVuICU+JSAKICBmaWx0ZXIoZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9iaG1fQSkpLCAKICAgICAgICAgZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9iaG1fQikpKQpgYGAKCgojIEFsbCBzYW1wbGVzCgojIyBDb25ncnVlbmNlCgpgYGB7ciBjb25ncnVlbmNlIGFsbCBzYW1wbGVzfQpjb25nX2FsbCA8LSBmYS5jb25ncnVlbmNlKHggPSBsaXN0KGVmYV91c19hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX2doX2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdGhfYWR1bHRzJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV9jaF9hZHVsdHMkbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX3Z0X2FkdWx0cyRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfdXNfY2hpbGRyZW4kbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX2doX2NoaWxkcmVuJGxvYWRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmYV90aF9jaGlsZHJlbiRsb2FkaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfY2hfY2hpbGRyZW4kbG9hZGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZhX3Z0X2NoaWxkcmVuJGxvYWRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSA1KSAlPiUKICAjIGdldF91cHBlcl90cmlfZnVuKCkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiZmFjdG9yX0EiKSAlPiUKICBnYXRoZXIoZmFjdG9yX0IsIGNvbmcsIC1mYWN0b3JfQSkgJT4lCiAgbGVmdF9qb2luKGJpbmRfcm93cyhmYWN0b3JfbmFtZXNfYWR1bHRzICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJBIiwgc2VwID0gIl8iKSkpLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkEiLCBzZXAgPSAiXyIpKSkpKSAlPiUKICBsZWZ0X2pvaW4oYmluZF9yb3dzKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSksCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQiIsIHNlcCA9ICJfIikpKSkpCmBgYAoKYGBge3IgY29uZyBhbGwgcGFpcnMgZm9ybWF0fQojIG1ha2Ugd2lkZS1mb3JtIHZlcnNpb24gb2YgZGYKY29uZ19hbGxfdyA8LSBjb25nX2FsbCAlPiUKICBzZWxlY3QoZmFjdG9yX0EsIGZhY3Rvcl9CLCBjb25nKSAlPiUKICBzcHJlYWQoZmFjdG9yX0IsIGNvbmcpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygiZmFjdG9yX0EiKQoKIyB0cmVhdCBzaW1pbGFyaXR5IG1hdHJpeCBhcyBpZiBpdCB3ZXJlIHRoZSBjb3JyZWxhdGlvbiBtYXRyaXggZm9yIGhjbHVzdApyb3cub3JkZXIgPC0gaGNsdXN0KGFzLmRpc3QoKDEgLSBjb25nX2FsbF93KS8yKSkkb3JkZXIKY29sLm9yZGVyIDwtIGhjbHVzdChhcy5kaXN0KHQoKDEgLSBjb25nX2FsbF93KS8yKSkpJG9yZGVyCgojIHJlLW9yZGVyIG1hdHJpeCBhY2NvcmluZyB0byBjbHVzdGVyaW5nCmNvbmdfYWxsX3cgPC0gY29uZ19hbGxfd1tyb3cub3JkZXIsIGNvbC5vcmRlcl0gCgojIGZvciBzb21lIHJlYXNvbiByZXNoYXBlMjo6bWVsdCgpIHdvcmtzIGJldHRlciB0aGFuIGN1cnJlbnQgdGlkeXZlcnNlIGZ1bmN0aW9ucy4uLgpjb25nX2FsbF9vcmRlcmVkIDwtIG1lbHQoYXMubWF0cml4KGNvbmdfYWxsX3cpKSAlPiUKICByZW5hbWUoZmFjdG9yX0Ffb3JkZXJlZCA9IFZhcjEsIAogICAgICAgICBmYWN0b3JfQl9vcmRlcmVkID0gVmFyMiwKICAgICAgICAgY29uZyA9IHZhbHVlKSAlPiUKICBtdXRhdGUoZmFjdG9yX0EgPSBhcy5jaGFyYWN0ZXIoZmFjdG9yX0Ffb3JkZXJlZCksCiAgICAgICAgIGZhY3Rvcl9CID0gYXMuY2hhcmFjdGVyKGZhY3Rvcl9CX29yZGVyZWQpKSAlPiUKICBmdWxsX2pvaW4oY29uZ19hbGwgJT4lIHNlbGVjdChjb250YWlucygiX0EiKSkgJT4lIGRpc3RpbmN0KCkpICU+JQogIGZ1bGxfam9pbihjb25nX2FsbCAlPiUgc2VsZWN0KGNvbnRhaW5zKCJfQiIpKSAlPiUgZGlzdGluY3QoKSkgJT4lCiAgbXV0YXRlKGxhYl9BID0gcGFzdGUocGFzdGUoY291bnRyeV9BLCBhZ2VfZ3JvdXBfQSksIGZhY3Rvcl9sYWJkZXNjcmlwdF9BLCBzZXAgPSAiLCAiKSwKICAgICAgICAgbGFiX0IgPSBwYXN0ZShwYXN0ZShjb3VudHJ5X0IsIGFnZV9ncm91cF9CKSwgZmFjdG9yX2xhYmRlc2NyaXB0X0IsIHNlcCA9ICIsICIpKQojIG11dGF0ZShzYW1wbGVfQSA9IHBhc3RlKGNvdW50cnlfQSwgYWdlX2dyb3VwX0EsIHNlcCA9ICIsICIpLAojICAgICAgICBzYW1wbGVfQiA9IHBhc3RlKGNvdW50cnlfQiwgYWdlX2dyb3VwX0IsIHNlcCA9ICIsICIpLAojICAgICAgICBsYWJfQSA9IHBhc3RlKHNhbXBsZV9BLCBmYWN0b3JfbGFiZGVzY3JpcHRfQSwgc2VwID0gIiAiKSwKIyAgICAgICAgbGFiX0IgPSBwYXN0ZShzYW1wbGVfQiwgZmFjdG9yX2xhYmRlc2NyaXB0X0IsIHNlcCA9ICIgIikpCmBgYAoKYGBge3IgY29uZyBhbGwgcGFpcnMgcGxvdCwgZmlnLndpZHRoID0gOS41LCBmaWcuYXNwID0gMC45fQojIEZJR1VSRSAyCmNvbmdfbG93ZXJfbGltIDwtIGlmZWxzZShtaW4oY29uZ19hbGxfb3JkZXJlZCRjb25nKSA+IC0wLjA1LCAtMC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oY29uZ19hbGxfb3JkZXJlZCRjb25nKSkKIyBjb25nX3Bsb3RfY29sb3JzIDwtIGMoInJlZDQiLCAiYmx1ZTQiLCAiZGFya29yY2hpZDQiLCAiYmxhY2siKQojIGNvbmdfcGxvdF9jb2xvcnMgPC0gYygiYmxhY2siLCAiYmxhY2siLCAiYmxhY2siLCAiYmxhY2siKQpjb25nX3Bsb3RfY29sb3JzIDwtIGMoInJlZDQiLCAicmVkNCIsICJyZWQ0IiwgImJsYWNrIikKCmNvbmdfYWxsX29yZGVyZWQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihsYWJfQSwgYXMubnVtZXJpYyhmYWN0b3JfQV9vcmRlcmVkKSksCiAgICAgICAgICAgICB5ID0gcmVvcmRlcihsYWJfQiwgYXMubnVtZXJpYyhkZXNjKGZhY3Rvcl9CX29yZGVyZWQpKSksCiAgICAgICAgICAgICBmaWxsID0gY29uZykpICsgCiAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBmb3JtYXQocm91bmQoY29uZywgMiksIG5zbWFsbCA9IDIpLAogICAgICAgICAgICAgICAgY29sb3IgPSBjYXNlX3doZW4oY29uZyA+IDAuODUgfiAiYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZyA+IDAuNzUgfiAiYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25nID4gMC42NSB+ICJjIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZCIpKSwKICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGKSArCiAgIyBib2R5LWxpa2UgZmFjdG9ycwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDUuNSwgeG1heCA9IDE1LjUsIHltaW4gPSAxNi41LCB5bWF4ID0gMjYuNSwKICAgICAgICAgICBjb2xvciA9IGNvbmdfcGxvdF9jb2xvcnNbMV0sIHNpemUgPSAxLjUsIGFscGhhID0gMCkgKwogICMgbWluZC1saWtlIGZhY3RvcnMKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAxNS41LCB4bWF4ID0gMjUuNSwgeW1pbiA9IDYuNSwgeW1heCA9IDE2LjUsCiAgICAgICAgICAgY29sb3IgPSBjb25nX3Bsb3RfY29sb3JzWzJdLCBzaXplID0gMS41LCBhbHBoYSA9IDApICsKICAjIGhlYXJ0LWxpa2UgZmFjdG9ycwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDI1LjUsIHhtYXggPSAzMS41LCB5bWluID0gMC41LCB5bWF4ID0gNi41LAogICAgICAgICAgIGNvbG9yID0gY29uZ19wbG90X2NvbG9yc1szXSwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwKSArCiAgIyBzY2FsZV9maWxsX3ZpcmlkaXNfYyh0cmFucyA9IHNjYWxlczo6ZXhwX3RyYW5zKGJhc2UgPSBleHAoMSkpLAogICMgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhjb25nX2xvd2VyX2xpbSwgMSksIAogICMgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKGNvbmdfbG93ZXJfbGltLCAxLCAwLjA1KSwKICAjICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoZm9ybWF0KHNlcShjb25nX2xvd2VyX2xpbSwgMC44LCAwLjA1KSwgbnNtYWxsID0gMiksCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwLjg1ID0gbW9kZXJhdGUiLCAiMC45MCIsIAogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMC45NSA9IGhpZ2giLCAiMS4wMCIpLAogICMgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gInZpcmlkaXMiLAogICMgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSA0MCkpICsKICBzY2FsZV9maWxsX2dyYWRpZW50bigjdHJhbnMgPSBzY2FsZXM6OmV4cF90cmFucyhiYXNlID0gZXhwKDEpKSwKICAgIGxpbWl0cyA9IGMoY29uZ19sb3dlcl9saW0sIDEpLCAKICAgIGJyZWFrcyA9IHNlcShjb25nX2xvd2VyX2xpbSwgMSwgMC4wNSksCiAgICBsYWJlbHMgPSBjKGZvcm1hdChzZXEoY29uZ19sb3dlcl9saW0sIDAuOCwgMC4wNSksIG5zbWFsbCA9IDIpLAogICAgICAgICAgICAgICAiMC44NSA9IG1vZGVyYXRlIiwgIjAuOTAiLCAKICAgICAgICAgICAgICAgIjAuOTUgPSBoaWdoIiwgIjEuMDAiKSwKICAgIGNvbG9ycyA9IHZpcmlkaXNMaXRlOjp2aXJpZGlzKDYpLAogICAgdmFsdWVzID0gYygwLCAwLjY1LCAwLjc1LCAwLjg1LCAwLjk1LCAxKSwKICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gNDApKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImdyYXk2MCIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICAjIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxLAogICAgICBhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSwKICAgICAgc2l6ZSA9IHNpemVfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygyMCwgMTQpKSwKICAgICAgY29sb3IgPSBjb2xvcl9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSwgY29sb3JfbGlzdCA9IGNvbmdfcGxvdF9jb2xvcnMpLAogICAgICBmYWNlICA9IGZhY2VfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EpKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gcmV2KHNpemVfZnVuKGNvbmdfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygyMCwgMTQpKSksCiAgICAgIGNvbG9yID0gcmV2KGNvbG9yX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gY29uZ19wbG90X2NvbG9ycykpLAogICAgICBmYWNlICA9IHJldihmYWNlX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BKSkpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAyMCksCiAgICAjIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSksCiAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2xpbmUoCiAgICAgIHNpemUgPSBzaXplX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBzaXplcyA9IGMoMS41LCAwLjUpKSwKICAgICAgY29sb3IgPSBjb2xvcl9mdW4oY29uZ19hbGxfb3JkZXJlZCRsYWJfQSwgY29sb3JfbGlzdCA9IGNvbmdfcGxvdF9jb2xvcnMpKSwKICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfbGluZSgKICAgICAgc2l6ZSA9IHJldihzaXplX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBzaXplcyA9IGMoMS41LCAwLjUpKSksCiAgICAgIGNvbG9yID0gcmV2KGNvbG9yX2Z1bihjb25nX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gY29uZ19wbG90X2NvbG9ycykpKSwKICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgwLjI1LCAiY20iKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCBmaWxsID0gZXhwcmVzc2lvbihpdGFsaWMocltjXSkpKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnMDJfb2JsaXF1ZS5wbmciKQpgYGAKCiMjIEphY2NhcmQgU2ltaWxhcml0eQoKYGBge3IgamFjY2FyZCBhbGwgc2FtcGxlc30Kc3Ryb25nX2xvYWRfYWxsIDwtIGxvYWRpbmdzX2FkdWx0cyAlPiUKICBiaW5kX3Jvd3MobG9hZGluZ3NfY2hpbGRyZW4pICU+JQogIHNlbGVjdChjb3VudHJ5LCBhZ2VfZ3JvdXAsIGZhY3RvciwgY2FwYWNpdHksIGxvYWRpbmcpICU+JQogIG11dGF0ZShzdHJvbmdfbG9hZCA9IGlmZWxzZShsb2FkaW5nID49IDAuNSwgMSwgMCkpICU+JQogIHNlbGVjdCgtbG9hZGluZykKCmNyb3NzX2xvYWRfYWxsIDwtIHN0cm9uZ19sb2FkX2FsbCAlPiUKICBmaWx0ZXIoc3Ryb25nX2xvYWQgPT0gMSkgJT4lCiAgY291bnQoY291bnRyeSwgYWdlX2dyb3VwLCBjYXBhY2l0eSwgc3Ryb25nX2xvYWQpICU+JQogIGZpbHRlcihuID4gMSkgJT4lCiAgbXV0YXRlKGNyb3NzX2xvYWQgPSBUKSAlPiUKICBzZWxlY3QoY291bnRyeSwgYWdlX2dyb3VwLCBjYXBhY2l0eSwgY3Jvc3NfbG9hZCkKCnN0cm9uZ19ub25jcm9zc19sb2FkX2FsbCA8LSBzdHJvbmdfbG9hZF9hbGwgJT4lCiAgbGVmdF9qb2luKGNyb3NzX2xvYWRfYWxsKSAlPiUKICBmaWx0ZXIoaXMubmEoY3Jvc3NfbG9hZCkpCgpqYWNjYXJkX2FsbCA8LSBzdHJvbmdfbm9uY3Jvc3NfbG9hZF9hbGwgJT4lCiAgc2VsZWN0KGZhY3RvciwgY2FwYWNpdHksIHN0cm9uZ19sb2FkKSAlPiUKICBzcHJlYWQoZmFjdG9yLCBzdHJvbmdfbG9hZCkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJjYXBhY2l0eSIpICU+JQogIHQoKSAlPiUKICBkaXN0KG1ldGhvZCA9ICJiaW5hcnkiLCBkaWFnID0gVCwgdXBwZXIgPSBUKSAlPiUKICBhcy5tYXRyaXgoKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJmYWN0b3JfQSIpICU+JQogIGdhdGhlcihmYWN0b3JfQiwgamFjY2FyZCwgLWZhY3Rvcl9BKSAlPiUKICAjIGNvbXB1dGUgc2ltaWxhcml0eSBpbmRleCBpbnN0ZWFkIG9mIGRpc3RhbmNlCiAgbXV0YXRlKGphY2NhcmQgPSAxIC0gamFjY2FyZCkgJT4lCiAgbGVmdF9qb2luKGJpbmRfcm93cyhmYWN0b3JfbmFtZXNfYWR1bHRzICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lX2FsbChmdW5zKHBhc3RlKC4sICJBIiwgc2VwID0gIl8iKSkpLAogICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzX2NoaWxkcmVuICU+JQogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkEiLCBzZXAgPSAiXyIpKSkpKSAlPiUKICBsZWZ0X2pvaW4oYmluZF9yb3dzKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVfYWxsKGZ1bnMocGFzdGUoLiwgIkIiLCBzZXAgPSAiXyIpKSksCiAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXNfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZV9hbGwoZnVucyhwYXN0ZSguLCAiQiIsIHNlcCA9ICJfIikpKSkpCmBgYAoKYGBge3IgamFjY2FyZCBhbGwgcGFpcnMgZm9ybWF0fQojIG1ha2Ugd2lkZS1mb3JtIHZlcnNpb24gb2YgZGYKamFjY2FyZF9hbGxfdyA8LSBqYWNjYXJkX2FsbCAlPiUKICBzZWxlY3QoZmFjdG9yX0EsIGZhY3Rvcl9CLCBqYWNjYXJkKSAlPiUKICBzcHJlYWQoZmFjdG9yX0IsIGphY2NhcmQpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygiZmFjdG9yX0EiKQoKIyB0cmVhdCBkaXN0YW5jZSBtYXRyaXggYXMgaWYgaXQgd2VyZSB0aGUgY29ycmVsYXRpb24gbWF0cml4IGZvciBoY2x1c3QKcm93Lm9yZGVyIDwtIGhjbHVzdChhcy5kaXN0KCgxIC0gamFjY2FyZF9hbGxfdykvMikpJG9yZGVyCmNvbC5vcmRlciA8LSBoY2x1c3QoYXMuZGlzdCh0KCgxIC0gamFjY2FyZF9hbGxfdykvMikpKSRvcmRlcgoKIyByZS1vcmRlciBtYXRyaXggYWNjb3JpbmcgdG8gY2x1c3RlcmluZwpqYWNjYXJkX2FsbF93IDwtIGphY2NhcmRfYWxsX3dbcm93Lm9yZGVyLCBjb2wub3JkZXJdIAoKIyBmb3Igc29tZSByZWFzb24gcmVzaGFwZTI6Om1lbHQoKSB3b3JrcyBiZXR0ZXIgdGhhbiBjdXJyZW50IHRpZHl2ZXJzZSBmdW5jdGlvbnMuLi4KamFjY2FyZF9hbGxfb3JkZXJlZCA8LSBtZWx0KGFzLm1hdHJpeChqYWNjYXJkX2FsbF93KSkgJT4lCiAgcmVuYW1lKGZhY3Rvcl9BX29yZGVyZWQgPSBWYXIxLCAKICAgICAgICAgZmFjdG9yX0Jfb3JkZXJlZCA9IFZhcjIsCiAgICAgICAgIGphY2NhcmQgPSB2YWx1ZSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9BID0gYXMuY2hhcmFjdGVyKGZhY3Rvcl9BX29yZGVyZWQpLAogICAgICAgICBmYWN0b3JfQiA9IGFzLmNoYXJhY3RlcihmYWN0b3JfQl9vcmRlcmVkKSkgJT4lCiAgZnVsbF9qb2luKGphY2NhcmRfYWxsICU+JSBzZWxlY3QoY29udGFpbnMoIl9BIikpICU+JSBkaXN0aW5jdCgpKSAlPiUKICBmdWxsX2pvaW4oamFjY2FyZF9hbGwgJT4lIHNlbGVjdChjb250YWlucygiX0IiKSkgJT4lIGRpc3RpbmN0KCkpICU+JQogIG11dGF0ZShsYWJfQSA9IHBhc3RlKHBhc3RlKGNvdW50cnlfQSwgYWdlX2dyb3VwX0EpLCBmYWN0b3JfbGFiZGVzY3JpcHRfQSwgc2VwID0gIiwgIiksCiAgICAgICAgIGxhYl9CID0gcGFzdGUocGFzdGUoY291bnRyeV9CLCBhZ2VfZ3JvdXBfQiksIGZhY3Rvcl9sYWJkZXNjcmlwdF9CLCBzZXAgPSAiLCAiKSkKIyBtdXRhdGUoc2FtcGxlX0EgPSBwYXN0ZShjb3VudHJ5X0EsIGFnZV9ncm91cF9BLCBzZXAgPSAiLCAiKSwKIyAgICAgICAgc2FtcGxlX0IgPSBwYXN0ZShjb3VudHJ5X0IsIGFnZV9ncm91cF9CLCBzZXAgPSAiLCAiKSwKIyAgICAgICAgbGFiX0EgPSBwYXN0ZShzYW1wbGVfQSwgZmFjdG9yX2xhYmRlc2NyaXB0X0EsIHNlcCA9ICIgIiksCiMgICAgICAgIGxhYl9CID0gcGFzdGUoc2FtcGxlX0IsIGZhY3Rvcl9sYWJkZXNjcmlwdF9CLCBzZXAgPSAiICIpKQpgYGAKCmBgYHtyIGphY2NhcmQgYWxsIHBhaXJzIHBsb3QsIGZpZy53aWR0aCA9IDkuNSwgZmlnLmFzcCA9IDAuOX0KIyBGSUdVUkUgMiBlcXVpdmFsZW50CmphY2NhcmRfbG93ZXJfbGltIDwtIGlmZWxzZShtaW4oamFjY2FyZF9hbGxfb3JkZXJlZCRqYWNjYXJkKSA+IDAsIDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgbWluKGphY2NhcmRfYWxsX29yZGVyZWQkamFjY2FyZCkpCiMgamFjY2FyZF9wbG90X2NvbG9ycyA8LSBjKCJyZWQ0IiwgImJsdWU0IiwgImRhcmtvcmNoaWQ0IiwgImJsYWNrIikKIyBqYWNjYXJkX3Bsb3RfY29sb3JzIDwtIGMoImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIikKamFjY2FyZF9wbG90X2NvbG9ycyA8LSBjKCJyZWQ0IiwgInJlZDQiLCAicmVkNCIsICJibGFjayIpCgpqYWNjYXJkX2FsbF9vcmRlcmVkICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIobGFiX0EsIGFzLm51bWVyaWMoZmFjdG9yX0Ffb3JkZXJlZCkpLAogICAgICAgICAgICAgeSA9IHJlb3JkZXIobGFiX0IsIGFzLm51bWVyaWMoZGVzYyhmYWN0b3JfQl9vcmRlcmVkKSkpLAogICAgICAgICAgICAgZmlsbCA9IGphY2NhcmQpKSArIAogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY2FzZV93aGVuKAogICAgIyBqYWNjYXJkICVpbiUgYygwLCAxKSB+IGZvcm1hdChyb3VuZChqYWNjYXJkLCAwKSwgbnNtYWxsID0gMCksCiAgICBUUlVFIH4gZm9ybWF0KHJvdW5kKGphY2NhcmQsIDIpLCBuc21hbGwgPSAyKSksCiAgICBjb2xvciA9IGNhc2Vfd2hlbihqYWNjYXJkID49IDAuNzUgfiAiYSIsIAogICAgICAgICAgICAgICAgICAgICAgamFjY2FyZCA+PSAwLjUgfiAiYiIsCiAgICAgICAgICAgICAgICAgICAgICBqYWNjYXJkID49IDAuMjUgfiAiYyIsCiAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gImQiKSksCiAgICBzaG93LmxlZ2VuZCA9IEYpICsKICAjIG1pbmQtbGlrZSBhbmQgb3RoZXIgZmFjdG9ycwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDAuNSwgeG1heCA9IDE0LjUsIHltaW4gPSAxNy41LCB5bWF4ID0gMzEuNSwKICAgICAgICAgICBjb2xvciA9IGphY2NhcmRfcGxvdF9jb2xvcnNbMl0sIHNpemUgPSAxLjUsIGFscGhhID0gMCkgKwogICMgYm9keS1saWtlIGZhY3RvcnMKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSAxNC41LCB4bWF4ID0gMjQuNSwgeW1pbiA9IDcuNSwgeW1heCA9IDE3LjUsCiAgICAgICAgICAgY29sb3IgPSBqYWNjYXJkX3Bsb3RfY29sb3JzWzFdLCBzaXplID0gMS41LCBhbHBoYSA9IDApICsKICAjIGhlYXJ0LWxpa2UgZmFjdG9ycwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDI0LjUsIHhtYXggPSAzMS41LCB5bWluID0gMC41LCB5bWF4ID0gNy41LAogICAgICAgICAgIGNvbG9yID0gamFjY2FyZF9wbG90X2NvbG9yc1szXSwgc2l6ZSA9IDEuNSwgYWxwaGEgPSAwKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoI3RyYW5zID0gc2NhbGVzOjpleHBfdHJhbnMoYmFzZSA9IGV4cCgxKSksCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhqYWNjYXJkX2xvd2VyX2xpbSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKGphY2NhcmRfbG93ZXJfbGltLCAxLCAwLjA1KSwKICAgICAgICAgICAgICAgICAgICAgICAjIGxhYmVscyA9IGMoZm9ybWF0KHNlcShqYWNjYXJkX2xvd2VyX2xpbSwgMC44LCAwLjA1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICBuc21hbGwgPSAyKSwKICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgIjAuODUgPSBtb2RlcmF0ZSIsICIwLjkwIiwKICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgIjAuOTUgPSBoaWdoIiwgIjEuMDAiKSwKICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAidmlyaWRpcyIsIAogICAgICAgICAgICAgICAgICAgICAgICMgZGlyZWN0aW9uID0gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSA0MCkpICsKICAjIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKCN0cmFucyA9IHNjYWxlczo6ZXhwX3RyYW5zKGJhc2UgPSBleHAoMSkpLAogICMgICBsaW1pdHMgPSBjKGphY2NhcmRfbG93ZXJfbGltLCAxKSwgCiAgIyAgIGJyZWFrcyA9IHNlcShqYWNjYXJkX2xvd2VyX2xpbSwgMSwgMC4wNSksCiAgIyAgIGxhYmVscyA9IGMoZm9ybWF0KHNlcShqYWNjYXJkX2xvd2VyX2xpbSwgMC44LCAwLjA1KSwgbnNtYWxsID0gMiksCiAgIyAgICAgICAgICAgICAgIjAuODUgPSBtb2RlcmF0ZSIsICIwLjkwIiwgCiAgIyAgICAgICAgICAgICAgIjAuOTUgPSBoaWdoIiwgIjEuMDAiKSwKICAjICAgY29sb3JzID0gdmlyaWRpc0xpdGU6OnZpcmlkaXMoNiksCiAgIyAgIHZhbHVlcyA9IGMoMCwgMC42NSwgMC43NSwgMC44NSwgMC45NSwgMSksCiAgIyAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gNDApKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImdyYXk2MCIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICAjIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxLAogICAgICBhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSwKICAgICAgc2l6ZSA9IHNpemVfZnVuKGphY2NhcmRfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygyMCwgMTQpKSwKICAgICAgY29sb3IgPSBjb2xvcl9mdW4oamFjY2FyZF9hbGxfb3JkZXJlZCRsYWJfQSwgY29sb3JfbGlzdCA9IGphY2NhcmRfcGxvdF9jb2xvcnMpLAogICAgICBmYWNlICA9IGZhY2VfZnVuKGphY2NhcmRfYWxsX29yZGVyZWQkbGFiX0EpKSwKICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KAogICAgICBzaXplID0gcmV2KHNpemVfZnVuKGphY2NhcmRfYWxsX29yZGVyZWQkbGFiX0EsIHNpemVzID0gYygyMCwgMTQpKSksCiAgICAgIGNvbG9yID0gcmV2KGNvbG9yX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gamFjY2FyZF9wbG90X2NvbG9ycykpLAogICAgICBmYWNlICA9IHJldihmYWNlX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BKSkpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAyMCksCiAgICAjIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSksCiAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2xpbmUoCiAgICAgIHNpemUgPSBzaXplX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBzaXplcyA9IGMoMS41LCAwLjUpKSwKICAgICAgY29sb3IgPSBjb2xvcl9mdW4oamFjY2FyZF9hbGxfb3JkZXJlZCRsYWJfQSwgY29sb3JfbGlzdCA9IGphY2NhcmRfcGxvdF9jb2xvcnMpKSwKICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfbGluZSgKICAgICAgc2l6ZSA9IHJldihzaXplX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBzaXplcyA9IGMoMS41LCAwLjUpKSksCiAgICAgIGNvbG9yID0gcmV2KGNvbG9yX2Z1bihqYWNjYXJkX2FsbF9vcmRlcmVkJGxhYl9BLCBjb2xvcl9saXN0ID0gamFjY2FyZF9wbG90X2NvbG9ycykpKSwKICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgwLjI1LCAiY20iKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCBmaWxsID0gIkphY2NhcmRcbnNpbWlsYXJpdHkiKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnMDJfb2JsaXF1ZV9qYWNjYXJkLnBuZyIpCmBgYAoKIyMgRGV2ZWxvcG1lbnRhbCBjb21wYXJpc29ucwoKYGBge3IgZGV2IGNvbXAgYWxsIHNpdGVzLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMS4yfQojIEZJR1VSRSBTNSwgRklHVVJFIFM2LCBGSUdVUkUgUzcsIEZJR1VSRSBTOCwgRklHVVJFIFM5CnBsb3RfZ3JpZChoZWF0bWFwX2NvbXBfZnVuKAogIGVmYV9saXN0ID0gbGlzdChlZmFfdXNfYWR1bHRzLCBlZmFfdXNfY2hpbGRyZW4pLCBwYWRkaW5nID0gRiksCiAgZGV2X2NvbmdfcGxvdF9mdW4oY29uZ19kZl9jaGlsZHJlbiwgd2hpY2hfY291bnRyeSA9ICJVUyIsIHBhZGRpbmcgPSBUKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDIsIDEuNSksIGxhYmVscyA9ICJBVVRPIikKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZ1MwNV9vYmxpcXVlLnBuZyIpCgpwbG90X2dyaWQoaGVhdG1hcF9jb21wX2Z1bigKICBlZmFfbGlzdCA9IGxpc3QoZWZhX2doX2FkdWx0cywgZWZhX2doX2NoaWxkcmVuKSwgcGFkZGluZyA9IEYpLAogIGRldl9jb25nX3Bsb3RfZnVuKGNvbmdfZGZfY2hpbGRyZW4sIHdoaWNoX2NvdW50cnkgPSAiR2hhbmEiLCBwYWRkaW5nID0gVCksCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygyLCAxLjUpLCBsYWJlbHMgPSAiQVVUTyIpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWdTMDZfb2JsaXF1ZS5wbmciKQoKcGxvdF9ncmlkKGhlYXRtYXBfY29tcF9mdW4oCiAgZWZhX2xpc3QgPSBsaXN0KGVmYV90aF9hZHVsdHMsIGVmYV90aF9jaGlsZHJlbiksIHBhZGRpbmcgPSBGKSwKICBkZXZfY29uZ19wbG90X2Z1bihjb25nX2RmX2NoaWxkcmVuLCB3aGljaF9jb3VudHJ5ID0gIlRoYWlsYW5kIiwgcGFkZGluZyA9IFQpLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMiwgMS41KSwgbGFiZWxzID0gIkFVVE8iKQpnZ3NhdmUoIi4uL2ZpZ3VyZXMvZmlnUzA3X29ibGlxdWUucG5nIikKCnBsb3RfZ3JpZChoZWF0bWFwX2NvbXBfZnVuKAogIGVmYV9saXN0ID0gbGlzdChlZmFfY2hfYWR1bHRzLCBlZmFfY2hfY2hpbGRyZW4pLCBwYWRkaW5nID0gRiksCiAgZGV2X2NvbmdfcGxvdF9mdW4oY29uZ19kZl9jaGlsZHJlbiwgd2hpY2hfY291bnRyeSA9ICJDaGluYSIsIHBhZGRpbmcgPSBUKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDIsIDEuNSksIGxhYmVscyA9ICJBVVRPIikKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZ1MwOF9vYmxpcXVlLnBuZyIpCgpwbG90X2dyaWQoaGVhdG1hcF9jb21wX2Z1bigKICBlZmFfbGlzdCA9IGxpc3QoZWZhX3Z0X2FkdWx0cywgZWZhX3Z0X2NoaWxkcmVuKSwgcGFkZGluZyA9IEYpLAogIGRldl9jb25nX3Bsb3RfZnVuKGNvbmdfZGZfY2hpbGRyZW4sIHdoaWNoX2NvdW50cnkgPSAiVmFudWF0dSIsIHBhZGRpbmcgPSBUKSwKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDIsIDEuNSksIGxhYmVscyA9ICJBVVRPIikKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZ1MwOV9vYmxpcXVlLnBuZyIpCmBgYAoKYGBge3IgbG9hZGluZ3MgYWxsIHNhbXBsZXMsIGZpZy53aWR0aCA9IDYuNSwgZmlnLmFzcCA9IDAuNn0KIyBGSUdVUkUgMQpoZWF0bWFwX2NvbXBfZnVuKGxpc3QoZWZhX3VzX2FkdWx0cywgZWZhX2doX2FkdWx0cywgZWZhX3RoX2FkdWx0cywgCiAgICAgICAgICAgICAgICAgICAgICBlZmFfY2hfYWR1bHRzLCBlZmFfdnRfYWR1bHRzLCAKICAgICAgICAgICAgICAgICAgICAgIGVmYV91c19jaGlsZHJlbiwgZWZhX2doX2NoaWxkcmVuLCBlZmFfdGhfY2hpbGRyZW4sIAogICAgICAgICAgICAgICAgICAgICAgZWZhX2NoX2NoaWxkcmVuLCBlZmFfdnRfY2hpbGRyZW4pLCAKICAgICAgICAgICAgICAgICBmYWNldF9vcmRlcl92YXJzID0gYygiYWdlX2dyb3VwIiwgImNvdW50cnkiLCAiZm51bSIpLAogICAgICAgICAgICAgICAgIGZhY2V0X2xhYl9zcGxpdCA9IFQpICsKICB0aGVtZShwYW5lbC5zcGFjaW5nLnggPSB1bml0KGMocmVwKDAuMiwgNCksIDEsIHJlcCgwLjIsIDQpKSwgImxpbmUiKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfY29sb3JiYXIoYmFyd2lkdGggPSAzMCwgYmFyaGVpZ2h0ID0gMC41LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkZhY3RvciBsb2FkaW5nIiwgdGl0bGUudmp1c3QgPSAxKSkKZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZzAxX29ibGlxdWUucG5nIikKYGBgCgpgYGB7ciBkb21pbmFudCBmYWN0b3IsIGZpZy53aWR0aCA9IDYuNSwgZmlnLmFzcCA9IDAuNiwgaW5jbHVkZSA9IEZ9CiMgaGlnaGxpZ2h0aW5nIGRvbWluYW50IGZhY3RvciAoaWdub3JpbmcgY3Jvc3MtbG9hZGluZ3MgPiAwLjA1KQpsb2FkaW5nc19hbGwgPC0gbG9hZGluZ3NfYWR1bHRzICU+JQogIHNlbGVjdCgtY29udGFpbnMoIm9yZCIpKSAlPiUKICBmdWxsX2pvaW4obG9hZGluZ3NfY2hpbGRyZW4gJT4lCiAgICAgICAgICAgICAgc2VsZWN0KC1jb250YWlucygib3JkIikpKQoKZG9tX2ZhY3RvcnNfYWxsIDwtIGxvYWRpbmdzX2FsbCAlPiUKICBncm91cF9ieShjb3VudHJ5LCBhZ2VfZ3JvdXAsIGNhcGFjaXR5KSAlPiUgCiAgdG9wX24oMSwgYWJzKGxvYWRpbmcpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGFnZV9ncm91cCwgY2FwYWNpdHksIGZhY3RvciwgbG9hZGluZykgJT4lCiAgcmVuYW1lKGRvbV9mYWN0b3IgPSBmYWN0b3IsCiAgICAgICAgIGRvbV9sb2FkaW5nID0gbG9hZGluZykKCnJlY3RfZGYgPC0gbG9hZGluZ3NfYWxsICU+JQogIGZ1bGxfam9pbihkb21fZmFjdG9yc19hbGwpICU+JQogIG11dGF0ZShmbnVtID0gZ3N1YigiLipfRiIsICJGIiwgZmFjdG9yKSkgJT4lCiAgc2VsZWN0KC1zdGFydHNfd2l0aCgiZmFjdG9yIikpICU+JQogIHNwcmVhZChmbnVtLCBsb2FkaW5nKSAlPiUKICBtdXRhdGUoZGlmZjEgPSBhYnMoZG9tX2xvYWRpbmcpIC0gYWJzKEYxKSwKICAgICAgICAgZGlmZjIgPSBhYnMoZG9tX2xvYWRpbmcpIC0gYWJzKEYyKSwKICAgICAgICAgZGlmZjMgPSBhYnMoZG9tX2xvYWRpbmcpIC0gYWJzKEYzKSwKICAgICAgICAgZGlmZjQgPSBhYnMoZG9tX2xvYWRpbmcpIC0gYWJzKEY0KSkgJT4lCiAgc2VsZWN0KC1jKGRvbV9sb2FkaW5nLCBzdGFydHNfd2l0aCgiRiIpKSkgJT4lCiAgZ2F0aGVyKHdoaWNoX2RpZmYsIGRpZmYsIHN0YXJ0c193aXRoKCJkaWZmIikpICU+JQogIGZpbHRlcihkaWZmICE9IDAsICFpcy5uYShkaWZmKSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgYWdlX2dyb3VwLCBjYXBhY2l0eSkgJT4lCiAgdG9wX24oLTEsIGRpZmYpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoYW55X3NtYWxsID0gZGlmZiA8IDAuMDUpICU+JQogIHJlbmFtZShmYWN0b3IgPSBkb21fZmFjdG9yKSAlPiUKICBsZWZ0X2pvaW4oZnVsbF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMsIGZhY3Rvcl9uYW1lc19jaGlsZHJlbikpCgojIGFuYWxvZyB0byBGSUdVUkUgMQp0ZW1wX2NhcF9vcmRlciA8LSBmYS5zb3J0KGVmYV91c19hZHVsdHMpJGxvYWRpbmdzW10gJT4lIHJvd25hbWVzKCkgJT4lIHJldigpCgpnZ3Bsb3QocmVjdF9kZiAlPiUKICAgICAgICAgZmlsdGVyKCFpcy5uYShhbnlfc21hbGwpKSAlPiUKICAgICAgICAgbXV0YXRlKGNhcGFjaXR5ID0gZmFjdG9yKGNhcGFjaXR5LCBsZXZlbHMgPSB0ZW1wX2NhcF9vcmRlcikpLAogICAgICAgYWVzKHggPSBmYWN0b3JfbGFiZGVzY3JpcHQsIAogICAgICAgICAgIHkgPSBjYXBhY2l0eSwgCiAgICAgICAgICAgZmlsbCA9IGFueV9zbWFsbCkpICsKICBmYWNldF9ncmlkKH4gaW50ZXJhY3Rpb24oY291bnRyeSwgYWdlX2dyb3VwKSwgc3BhY2UgPSAiZnJlZSIsIHNjYWxlcyA9ICJmcmVlIikgKwogIGdlb21fdGlsZSgpICsKICB0aGVtZShwYW5lbC5zcGFjaW5nLnggPSB1bml0KGMocmVwKDAuMiwgNCksIDEsIHJlcCgwLjIsIDQpKSwgImxpbmUiKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCiMgZ2dzYXZlKCIuLi9maWd1cmVzL2ZpZzAxdjJfb2JsaXF1ZS5wbmciKQpgYGAKCmBgYHtyIGxvYWRpbmdzIGFsbCBzYW1wbGVzIHYyLCBmaWcud2lkdGggPSA2LjUsIGZpZy5hc3AgPSAwLjZ9CiMgYWx0ZXJuYXRpdmUgdG8gRklHVVJFIDEKbG9hZGluZ3NfYWR1bHRzICU+JQogIGJpbmRfcm93cyhsb2FkaW5nc19jaGlsZHJlbikgJT4lCiAgIyBzZWxlY3QoLWNvbnRhaW5zKCJfb3JkIikpICU+JQogIG11dGF0ZShmYWN0b3JfYmhtID0gY2FzZV93aGVuKAogICAgZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdCkpIH4gIkJPRFktbGlrZSBmYWN0b3JzIiwKICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHQpKSB+ICJNSU5ELWxpa2UgZmFjdG9ycyIsCiAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdCkpIH4gIkhFQVJULWxpa2UgZmFjdG9ycyIsCiAgICBUUlVFIH4gIk90aGVyIikpICU+JQogIGxlZnRfam9pbihzdHJvbmdfbm9uY3Jvc3NfbG9hZF9hbGwgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChmYWN0b3IsIGNhcGFjaXR5LCBzdHJvbmdfbG9hZCwgY3Jvc3NfbG9hZCkpICU+JQogIG11dGF0ZShmb250X2ZhY2UgPSBjYXNlX3doZW4oCiAgICBzdHJvbmdfbG9hZCA9PSAxICYgaXMubmEoY3Jvc3NfbG9hZCkgfiAiYm9sZCIsCiAgICBUUlVFIH4gInBsYWluIikpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocGFzdGUoZ3N1YigiRmFjdG9yICIsICJGIiwgZmFjdG9yX25hbWUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9kZXNjcmlwdCwgc2VwID0gIjogIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgYXMubnVtZXJpYyhjb3VudHJ5KSksIAogICAgICAgICAgICAgeSA9IHJlb3JkZXIoY2FwYWNpdHlfb3JkX3VzLCBkZXNjKGNhcGFjaXR5X29yZF91cykpLAogICAgICAgICAgICAgZmlsbCA9IGxvYWRpbmcpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhmYWN0b3JfYmhtLCBhZ2VfZ3JvdXApLCAKICAgICAgICAgICAgIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC4yKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZvcm1hdChyb3VuZChsb2FkaW5nLCAyKSwgbnNtYWxsID0gMiksIAogICAgICAgICAgICAgICAgZm9udGZhY2UgPSBmb250X2ZhY2UpLCBzaXplID0gMykgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoYygwLjIsIDEsIDAuMiwgMSwgMC4yLCAxLCAwLjIpLCAibGluZSIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9jb2xvcmJhcihiYXJ3aWR0aCA9IDMwLCBiYXJoZWlnaHQgPSAwLjUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiRmFjdG9yIGxvYWRpbmciLCB0aXRsZS52anVzdCA9IDEpKQogICMgc2VsZWN0KGNvdW50cnksIGNhcGFjaXR5LCBsb2FkaW5nKSAlPiUKICAjIG11dGF0ZShsb2FkaW5nID0gcm91bmQobG9hZGluZywgMikpICU+JQogICMgc3ByZWFkKGNvdW50cnksIGxvYWRpbmcpCmdnc2F2ZSgiLi4vZmlndXJlcy9maWcwMXYyX29ibGlxdWUucG5nIikKYGBgCgojIyBPdGhlciBtZXRyaWNzIG9mIHNpbWlsYXJpdHkKCmBgYHtyfQpsb2FkaW5nc19hZHVsdHMgJT4lCiAgZmlsdGVyKGZhY3RvciA9PSAidXNBRFVMVFNfRjEiKSAlPiUKICBmaWx0ZXIobG9hZGluZyA+PSAwLjUwKQoKbG9hZGluZ3NfYWR1bHRzICU+JQogIGJpbmRfcm93cyhsb2FkaW5nc19jaGlsZHJlbikgJT4lCiAgIyBmaWx0ZXIoZ3JlcGwoImJvZHkiLCBmYWN0b3JfZGVzY3JpcHQpKSAlPiUKICBzZWxlY3QoY291bnRyeSwgZmFjdG9yLCBjYXBhY2l0eSwgbG9hZGluZykgJT4lCiAgZmlsdGVyKGxvYWRpbmcgPj0gMC41MCkgJT4lCiAgY291bnQoY291bnRyeSwgZmFjdG9yKQpgYGAKCmBgYHtyfQpzdHJvbmdfbG9hZGluZ3MgPC0gbG9hZGluZ3NfYWxsICU+JQogIHNlbGVjdChmYWN0b3IsIGNhcGFjaXR5LCBsb2FkaW5nKSAlPiUKICBtdXRhdGUoc3Ryb25nX2xvYWQgPSBpZmVsc2UobG9hZGluZyA+PSAwLjUsIDEsIDApKSAlPiUKICBzZWxlY3QoLWxvYWRpbmcpICU+JQogIHNwcmVhZChmYWN0b3IsIHN0cm9uZ19sb2FkKQpgYGAKCmBgYHtyfQpjb21wYXJlX2Z1biA8LSBmdW5jdGlvbih4LCB5KSB7CiAgcmVzIDwtIHggPT0geQogIHJlcyA8LSBzdW0ocmVzKS9sZW5ndGgoeCkKICByZXR1cm4ocmVzKQp9CmBgYAoKYGBge3J9CmNvbXBhcmVfZnVuKHN0cm9uZ19sb2FkaW5ncyRjaEFEVUxUU19GMSwgc3Ryb25nX2xvYWRpbmdzJGNoQURVTFRTX0YyKQpgYGAKCmBgYHtyfQpiaW5fc2ltIDwtIGxvYWRpbmdzX2FsbCAlPiUKICBzZWxlY3QoZmFjdG9yLCBjYXBhY2l0eSwgbG9hZGluZykgJT4lCiAgbXV0YXRlKHN0cm9uZ19sb2FkID0gaWZlbHNlKGxvYWRpbmcgPj0gMC41LCAxLCAwKSkgJT4lCiAgc2VsZWN0KC1sb2FkaW5nKSAlPiUKICBzcHJlYWQoZmFjdG9yLCBzdHJvbmdfbG9hZCkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJjYXBhY2l0eSIpICU+JQogIHQoKSAlPiUKICBkaXN0KG1ldGhvZCA9ICJiaW5hcnkiLCBkaWFnID0gVCwgdXBwZXIgPSBUKSAlPiUKICBhcy5tYXRyaXgoKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJmYWN0b3JfQSIpICU+JQogIGdhdGhlcihmYWN0b3JfQiwgYmluX3NpbSwgLWZhY3Rvcl9BKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoYmluX3NpbSwgCiAgICAgICBhZXMoeCA9IGZhY3Rvcl9BLCB5ID0gZmFjdG9yX0IsIGZpbGwgPSBiaW5fc2ltKSkgKwogIGdlb21fdGlsZSgpCmBgYAoKYGBge3J9CnN0cm9uZ19sb2FkX2Z1biA8LSBmdW5jdGlvbih3aGljaF9iYXNlLCB3aGljaF9iaG0sIHdoaWNoX2FnZV9ncm91cCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXRvZmYpIHsKICBkZiA8LSBsb2FkaW5nc19hZHVsdHMgJT4lCiAgICBiaW5kX3Jvd3MobG9hZGluZ3NfY2hpbGRyZW4pICU+JQogICAgZmlsdGVyKGdyZXBsKHdoaWNoX2JobSwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHQpKSkgJT4lCiAgICBzZWxlY3QoY2FwYWNpdHksIGZhY3RvciwgbG9hZGluZykgJT4lCiAgICBzcHJlYWQoZmFjdG9yLCBsb2FkaW5nKSAlPiUKICAgIGZpbHRlcl9hdCh2YXJzKC1jYXBhY2l0eSksIGFueV92YXJzKC4gPiBjdXRvZmYpKSAlPiUKICAgIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1jYXBhY2l0eSkgJT4lCiAgICBtdXRhdGUoc3Ryb25nX2xvYWQgPSBpZmVsc2UobG9hZGluZyA+IGN1dG9mZiwgVCwgRikpICU+JQogICAgY291bnQoZmFjdG9yLCBzdHJvbmdfbG9hZCkgJT4lCiAgICBncm91cF9ieShmYWN0b3IpICU+JQogICAgbXV0YXRlKHByb3Bfc3Ryb25nX2xvYWQgPSBuL3N1bShuKSkgJT4lCiAgICBmaWx0ZXIoc3Ryb25nX2xvYWQgPT0gVCkgJT4lCiAgICBzZWxlY3QoZmFjdG9yLCBwcm9wX3N0cm9uZ19sb2FkKSAlPiUKICAgIGxlZnRfam9pbihmdWxsX2pvaW4oZmFjdG9yX25hbWVzX2FkdWx0cywgZmFjdG9yX25hbWVzX2NoaWxkcmVuKSkgJT4lCiAgICBtdXRhdGUoZmFjdG9yX2JobSA9IGNhc2Vfd2hlbigKICAgICAgZ3JlcGwoImJvZHkiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdCkpIH4gIkJPRFktbGlrZSBmYWN0b3JzIiwKICAgICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdCkpIH4gIk1JTkQtbGlrZSBmYWN0b3JzIiwKICAgICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHQpKSB+ICJIRUFSVC1saWtlIGZhY3RvcnMiLAogICAgICBUUlVFIH4gIk90aGVyIikpICU+JQogICAgZmlsdGVyKGFzLmNoYXJhY3RlcihhZ2VfZ3JvdXApICVpbiUgd2hpY2hfYWdlX2dyb3VwKQogIAogIHJldHVybihkZikKfQpgYGAKCmBgYHtyfQpzdHJvbmdfbG9hZF9wbG90X2Z1biA8LSBmdW5jdGlvbihzdHJvbmdfZGYsIHdoaWNoX2JobSkgewogIGcgPC0gc3Ryb25nX2RmICU+JQogICAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihmYWN0b3IsIGFzLm51bWVyaWMoY291bnRyeSkpLCAKICAgICAgICAgICAgICAgeSA9IHByb3Bfc3Ryb25nX2xvYWQsIGZpbGwgPSBjb3VudHJ5KSkgKwogICAgZmFjZXRfZ3JpZCguIH4gZmFjdG9yX2JobSwgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWVfeCIpICsKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSkpICsKICAgIGxhYnModGl0bGUgPSBwYXN0ZTAodG91cHBlcih3aGljaF9iaG0pLCAiLWxpa2UgZmFjdG9ycyIpKSAKICAKICByZXR1cm4oZykKfQpgYGAKCmBgYHtyfQpzdHJvbmdfbG9hZF9mdW4od2hpY2hfYmhtID0gImJvZHkiLCB3aGljaF9hZ2VfZ3JvdXAgPSAiYWR1bHRzIiwgY3V0b2ZmID0gMC41KQpzdHJvbmdfbG9hZF9mdW4od2hpY2hfYmhtID0gImhlYXJ0Iiwgd2hpY2hfYWdlX2dyb3VwID0gImFkdWx0cyIsIGN1dG9mZiA9IDAuNSkKc3Ryb25nX2xvYWRfZnVuKHdoaWNoX2JobSA9ICJtaW5kIiwgd2hpY2hfYWdlX2dyb3VwID0gImFkdWx0cyIsIGN1dG9mZiA9IDAuNSkKYGBgCgoKYGBge3J9CnN0cm9uZ19sb2FkX2Z1bih3aGljaF9iaG0gPSAiYm9keSIsIHdoaWNoX2FnZV9ncm91cCA9ICJhZHVsdHMiLCBjdXRvZmYgPSAwLjUpICU+JQogIHN0cm9uZ19sb2FkX3Bsb3RfZnVuKHdoaWNoX2JobSA9ICJib2R5IikKc3Ryb25nX2xvYWRfZnVuKHdoaWNoX2JobSA9ICJoZWFydCIsIHdoaWNoX2FnZV9ncm91cCA9ICJhZHVsdHMiLCBjdXRvZmYgPSAwLjUpCnN0cm9uZ19sb2FkX2Z1bih3aGljaF9iaG0gPSAibWluZCIsIHdoaWNoX2FnZV9ncm91cCA9ICJhZHVsdHMiLCBjdXRvZmYgPSAwLjUpCmBgYAoKCiMjIFZhcmlhbmNlIGFjY291bnRlZCBmb3IKCmBgYHtyfQpWYWNjb3VudGVkX2Z1biA8LSBmdW5jdGlvbihlZmFfbmFtZSkgewogIGNvdW50cnkgPC0gZ3N1YigiZWZhXyIsICIiLCBlZmFfbmFtZSkKICBjb3VudHJ5IDwtIGdzdWIoIl8uKiQiLCAiIiwgY291bnRyeSkKICBhZ2VfZ3JvdXAgPC0gY2FzZV93aGVuKGdyZXBsKCJhZHVsdCIsIGVmYV9uYW1lKSB+ICJhZHVsdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoImNoaWxkIiwgZWZhX25hbWUpIH4gImNoaWxkcmVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKQogIAogIGVmYSA8LSBnZXQoZWZhX25hbWUpCiAgcmVzIDwtIGVmYSRWYWNjb3VudGVkICU+JQogICAgZGF0YS5mcmFtZSgpICU+JQogICAgcm93bmFtZXNfdG9fY29sdW1uKCJtZXRyaWMiKSAlPiUKICAgIG11dGF0ZShjb3VudHJ5ID0gZmFjdG9yKGNvdW50cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2giLCAidGgiLCAiY2giLCAidnQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVsc19jb3VudHJ5KSwKICAgICAgICAgICBhZ2VfZ3JvdXAgPSBmYWN0b3IoYWdlX2dyb3VwLCBsZXZlbHMgPSBjKCJhZHVsdHMiLCAiY2hpbGRyZW4iKSkpCiAgCiAgcmV0dXJuKHJlcykKfQpgYGAKCmBgYHtyfQpWYWNjb3VudGVkX2FsbCA8LSBWYWNjb3VudGVkX2Z1bigiZWZhX3VzX2FkdWx0cyIpICU+JQogIGZ1bGxfam9pbihWYWNjb3VudGVkX2Z1bigiZWZhX2doX2FkdWx0cyIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV90aF9hZHVsdHMiKSkgJT4lCiAgZnVsbF9qb2luKFZhY2NvdW50ZWRfZnVuKCJlZmFfY2hfYWR1bHRzIikpICU+JQogIGZ1bGxfam9pbihWYWNjb3VudGVkX2Z1bigiZWZhX3Z0X2FkdWx0cyIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV91c19jaGlsZHJlbiIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV9naF9jaGlsZHJlbiIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV90aF9jaGlsZHJlbiIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV9jaF9jaGlsZHJlbiIpKSAlPiUKICBmdWxsX2pvaW4oVmFjY291bnRlZF9mdW4oImVmYV92dF9jaGlsZHJlbiIpKQpgYGAKCmBgYHtyfQpWYWNjb3VudGVkX2FsbCAlPiUKICBmaWx0ZXIobWV0cmljICVpbiUgYygiUHJvcG9ydGlvbiBWYXIiLCAiUHJvcG9ydGlvbiBFeHBsYWluZWQiKSkgJT4lCiAgZ2F0aGVyKGZhY3RvciwgdmFsdWUsIHN0YXJ0c193aXRoKCJGIikpICU+JQogIG11dGF0ZSh2YWx1ZSA9IHJvdW5kKHZhbHVlLCAyKSkgJT4lCiAgc3ByZWFkKGNvdW50cnksIHZhbHVlKSAlPiUKICBhcnJhbmdlKGFnZV9ncm91cCwgZmFjdG9yLCBtZXRyaWMpCmBgYApgYGB7cn0KVmFjY291bnRlZF9hbGwgJT4lCiAgZmlsdGVyKG1ldHJpYyA9PSAiQ3VtdWxhdGl2ZSBWYXIiKSAlPiUKICBnYXRoZXIoZmFjdG9yLCB2YWx1ZSwgc3RhcnRzX3dpdGgoIkYiKSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgYWdlX2dyb3VwKSAlPiUKICB0b3BfbigxLCB2YWx1ZSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh2YWx1ZSA9IHJvdW5kKHZhbHVlLCAyKSkgJT4lCiAgc2VsZWN0KG1ldHJpYywgY291bnRyeSwgYWdlX2dyb3VwLCB2YWx1ZSkgJT4lCiAgc3ByZWFkKGNvdW50cnksIHZhbHVlKSAlPiUKICBhcnJhbmdlKGFnZV9ncm91cCwgbWV0cmljKQpgYGAKIyMgSW50ZXJmYWN0b3IgY29ycmVsYXRpb25zCgpgYGB7cn0KaW50ZXJmYWN0b3JfY29yX2Z1biA8LSBmdW5jdGlvbihlZmFfbmFtZSkgewogIHNhbXBsZSA9IGdzdWIoImVmYV8iLCAiIiwgZWZhX25hbWUpCiAgY291bnRyeSA9IGdzdWIoIl8uKiQiLCAiIiwgc2FtcGxlKQogIGFnZV9ncm91cCA9IGdzdWIoIl4uKl8iLCAiIiwgc2FtcGxlKQogIAogIGVmYSA8LSBnZXQoZWZhX25hbWUpCiAgCiAgIyBoYWNreSwgbm90IHN1cmUgd2h5IHRoaXMgd29ya3MsIGJ1dCBpdCdzIHRoZSBvbmx5IHdheSBpIGNvdWxkIGdldCBDSXMKICBkZiA8LSBwcmludChlZmEpICU+JQogICAgZGF0YS5mcmFtZSgpICU+JQogICAgcm93bmFtZXNfdG9fY29sdW1uKCJmYWN0b3JfcGFpciIpICU+JQogICAgc2VwYXJhdGUoZmFjdG9yX3BhaXIsIGMoImZhY3Rvcl9BIiAsImZhY3Rvcl9CIiksIHNlcCA9ICItIikgJT4lCiAgICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZmFjdG9yIikpLCB+IGdzdWIoIl4uKl8iLCAiIiwgLikpCiAgCiAgIyBkZiA8LSBlZmEkUGhpICU+JQogICMgICBkYXRhLmZyYW1lKCkgJT4lCiAgIyAgIHJvd25hbWVzX3RvX2NvbHVtbigiZmFjdG9yX0EiKQogICMgZ2F0aGVyKGZhY3Rvcl9CLCBwaGksIC1mYWN0b3JfQSkKICAKICBkZiA8LSBkZiAlPiUKICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZmFjdG9yIikpLAogICAgICAgICAgICB+IHBhc3RlMChjb3VudHJ5LCB0b3VwcGVyKGFnZV9ncm91cCksICJfIiwgLikpICU+JQogICAgbXV0YXRlKGNvdW50cnkgPSBmYWN0b3IoY291bnRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInVzIiwgImdoIiwgInRoIiwgImNoIiwgInZ0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsZXZlbHNfY291bnRyeSksCiAgICAgICAgICAgYWdlX2dyb3VwID0gZmFjdG9yKGFnZV9ncm91cCwgbGV2ZWxzID0gYygiYWR1bHRzIiwgImNoaWxkcmVuIikpKQogIAogIHJldHVybihkZikKfQpgYGAKCmBgYHtyLCByZXN1bHRzID0gImhpZGUifQpkX3BoaSA8LSBiaW5kX3Jvd3MoaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX3VzX2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX2doX2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX3RoX2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX2NoX2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX3Z0X2FkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX3VzX2NoaWxkcmVuIiksCiAgICAgICAgICAgICAgICAgICBpbnRlcmZhY3Rvcl9jb3JfZnVuKCJlZmFfZ2hfY2hpbGRyZW4iKSwKICAgICAgICAgICAgICAgICAgIGludGVyZmFjdG9yX2Nvcl9mdW4oImVmYV90aF9jaGlsZHJlbiIpLAogICAgICAgICAgICAgICAgICAgaW50ZXJmYWN0b3JfY29yX2Z1bigiZWZhX2NoX2NoaWxkcmVuIiksCiAgICAgICAgICAgICAgICAgICBpbnRlcmZhY3Rvcl9jb3JfZnVuKCJlZmFfdnRfY2hpbGRyZW4iKSkKYGBgCmBgYHtyfQpkX3BoaSA8LSBkX3BoaSAlPiUKICBmdWxsX2pvaW4oZF9waGkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lX2FsbCh+IGdzdWIoImZhY3Rvcl9BIiwgImZhY3Rvcl9DIiwgLikpICU+JQogICAgICAgICAgICAgIHJlbmFtZV9hbGwofiBnc3ViKCJmYWN0b3JfQiIsICJmYWN0b3JfRCIsIC4pKSAlPiUKICAgICAgICAgICAgICByZW5hbWVfYWxsKH4gZ3N1YigiZmFjdG9yX0QiLCAiZmFjdG9yX0EiLCAuKSkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lX2FsbCh+IGdzdWIoImZhY3Rvcl9DIiwgImZhY3Rvcl9CIiwgLikpKSAlPiUgZGlzdGluY3QoKQpgYGAKCmBgYHtyfQpkX3BoaSA8LSBkX3BoaSAlPiUKICBzZWxlY3QoLWNvdW50cnksIC1hZ2VfZ3JvdXApICU+JQogIGxlZnRfam9pbihmYWN0b3JfbmFtZXNfYWR1bHRzICU+JQogICAgICAgICAgICAgIGZ1bGxfam9pbihmYWN0b3JfbmFtZXNfY2hpbGRyZW4pICU+JQogICAgICAgICAgICAgIHJlbmFtZV9hbGwofnBhc3RlMCguLCAiX0EiKSkpICU+JQogIG11dGF0ZShmYWN0b3JfYmhtX0EgPSBjYXNlX3doZW4oCiAgICBncmVwbCgiYm9keSIsIHRvbG93ZXIoZmFjdG9yX2Rlc2NyaXB0X0EpKSB+ICJCb2R5LWxpa2UgZmFjdG9yIiwKICAgIGdyZXBsKCJtaW5kIiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIH4gIk1pbmQtbGlrZSBmYWN0b3IiLAogICAgZ3JlcGwoImhlYXJ0IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQSkpIH4gIkhlYXJ0LWxpa2UgZmFjdG9yIiwKICAgIFRSVUUgfiAiT3RoZXIiKSkgJT4lCiAgbGVmdF9qb2luKGZhY3Rvcl9uYW1lc19hZHVsdHMgJT4lCiAgICAgICAgICAgICAgZnVsbF9qb2luKGZhY3Rvcl9uYW1lc19jaGlsZHJlbikgJT4lCiAgICAgICAgICAgICAgcmVuYW1lX2FsbCh+cGFzdGUwKC4sICJfQiIpKSkgJT4lCiAgbXV0YXRlKGZhY3Rvcl9iaG1fQiA9IGNhc2Vfd2hlbigKICAgIGdyZXBsKCJib2R5IiwgdG9sb3dlcihmYWN0b3JfZGVzY3JpcHRfQikpIH4gIkJvZHktbGlrZSBmYWN0b3IiLAogICAgZ3JlcGwoIm1pbmQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSkgfiAiTWluZC1saWtlIGZhY3RvciIsCiAgICBncmVwbCgiaGVhcnQiLCB0b2xvd2VyKGZhY3Rvcl9kZXNjcmlwdF9CKSkgfiAiSGVhcnQtbGlrZSBmYWN0b3IiLAogICAgVFJVRSB+ICJPdGhlciIpKSAlPiUKICBtdXRhdGVfYXQodmFycyhmYWN0b3JfYmhtX0EsIGZhY3Rvcl9iaG1fQiksCiAgICAgICAgICAgIH4gZmFjdG9yKC4sIGxldmVscyA9IGMoIkJvZHktbGlrZSBmYWN0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWFydC1saWtlIGZhY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbmQtbGlrZSBmYWN0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdGhlciIpKSkgJT4lCiAgc2VsZWN0KC1jb3VudHJ5X0IsIC1hZ2VfZ3JvdXBfQikgJT4lCiAgcmVuYW1lKGNvdW50cnkgPSBjb3VudHJ5X0EsIGFnZV9ncm91cCA9IGFnZV9ncm91cF9BKQpgYGAKCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDF9CmRfcGhpICU+JQogIGdncGxvdChhZXMoeCA9IGZhY3Rvcl9iaG1fQSwgCiAgICAgICAgICAgICB5ID0gcmVvcmRlcihmYWN0b3JfYmhtX0IsIGRlc2MoZmFjdG9yX2JobV9CKSksIAogICAgICAgICAgICAgZmlsbCA9IGVzdGltYXRlKSkgKwogIGZhY2V0X2dyaWQoY291bnRyeSB+IGFnZV9ncm91cCwgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGVzdGltYXRlLCAyKSwgbnNtYWxsID0gMikpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIGZpbGwgPSBxdW90ZShwaGkpKQpgYGAKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjZ9CmRfcGhpICU+JQogIGdncGxvdChhZXMoeCA9IGZhY3Rvcl9iaG1fQSwgCiAgICAgICAgICAgICBjb2xvciA9IGNvdW50cnksCiAgICAgICAgICAgICAjIHNoYXBlID0gYWdlX2dyb3VwLAogICAgICAgICAgICAgeSA9IGVzdGltYXRlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDUsIGNvbG9yID0gImdyYXk1MCIpICsKICBmYWNldF9ncmlkKGFnZV9ncm91cCB+IGZhY3Rvcl9iaG1fQiwgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gbG93ZXIsIHltYXggPSB1cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLAogICAgICAgICAgICAgICAgICBmYXR0ZW4gPSAyKSArCiAgIyBnZW9tX3RleHQoYWVzKGxhYmVsID0gZm9ybWF0KHJvdW5kKGVzdGltYXRlLCAyKSwgbnNtYWxsID0gMikpKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoTkEsIDEpLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDEsIDAuNSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gcXVvdGUocGhpKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuN30KZF9waGkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gY291bnRyeSwgCiAgICAgICAgICAgICBjb2xvciA9IGNvdW50cnksCiAgICAgICAgICAgICBncm91cCA9IGFnZV9ncm91cCwgc2hhcGUgPSBhZ2VfZ3JvdXAsCiAgICAgICAgICAgICB5ID0gZXN0aW1hdGUpKSArCiAgZmFjZXRfZ3JpZChmYWN0b3JfYmhtX0EgfiBmYWN0b3JfYmhtX0IsIHNjYWxlcyA9ICJmcmVlX3giLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIsIGNvbG9yID0gImdyZXk1MCIpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICAjIGdlb21fdGV4dChhZXMoeSA9IGlmZWxzZShhZ2VfZ3JvdXAgPT0gImFkdWx0cyIsIAogICMgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlICsgMC4xLAogICMgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlIC0gMC4wNSksCiAgIyAgICAgICAgICAgICAgIGxhYmVsID0gZm9ybWF0KHJvdW5kKGVzdGltYXRlLCAyKSwgbnNtYWxsID0gMikpLAogICMgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoTkEsIDEpLCAKICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDEsIDAuNSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gcXVvdGUocGhpKSwgCiAgICAgICBzaGFwZSA9ICJBZ2UgZ3JvdXAiLCBzaXplID0gIkFnZSBncm91cCIsIAogICAgICAgY29sb3IgPSAiU2l0ZSIpCmBgYAoKYGBge3J9CmNhdCgiVVMgQURVTFRTXG4iKQplZmFfdXNfYWR1bHRzJFBoaQooZWZhX3VzX2FkdWx0cyRQaGkpXjIKCmNhdCgiXG5VUyBDSElMRFJFTlxuIikKZWZhX3VzX2NoaWxkcmVuJFBoaQooZWZhX3VzX2NoaWxkcmVuJFBoaSleMgpgYGAKCmBgYHtyfQpjYXQoIkdIQU5BIEFEVUxUU1xuIikKZWZhX2doX2FkdWx0cyRQaGkKKGVmYV9naF9hZHVsdHMkUGhpKV4yCgpjYXQoIlxuR0hBTkEgQ0hJTERSRU5cbiIpCmVmYV9naF9jaGlsZHJlbiRQaGkKKGVmYV9naF9jaGlsZHJlbiRQaGkpXjIKYGBgCgpgYGB7cn0KY2F0KCJUSEFJTEFORCBBRFVMVFNcbiIpCmVmYV90aF9hZHVsdHMkUGhpCihlZmFfdGhfYWR1bHRzJFBoaSleMgoKY2F0KCJcblRIQUlMQU5EIENISUxEUkVOXG4iKQplZmFfdGhfY2hpbGRyZW4kUGhpCihlZmFfdGhfY2hpbGRyZW4kUGhpKV4yCmBgYAoKYGBge3J9CmNhdCgiQ0hJTkEgQURVTFRTXG4iKQplZmFfY2hfYWR1bHRzJFBoaQooZWZhX2NoX2FkdWx0cyRQaGkpXjIKCmNhdCgiXG5DSElOQSBDSElMRFJFTlxuIikKZWZhX2NoX2NoaWxkcmVuJFBoaQooZWZhX2NoX2NoaWxkcmVuJFBoaSleMgpgYGAKCmBgYHtyfQpjYXQoIlZBTlVBVFUgQURVTFRTXG4iKQplZmFfdnRfYWR1bHRzJFBoaQooZWZhX3Z0X2FkdWx0cyRQaGkpXjIKCmNhdCgiXG5WQU5VQVRVIENISUxEUkVOXG4iKQplZmFfdnRfY2hpbGRyZW4kUGhpCihlZmFfdnRfY2hpbGRyZW4kUGhpKV4yCmBgYAoKYGBge3J9CgpgYGAKCgo=